ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2U1NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZTMzYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gTWFyIDA5IDIwOjM2OjQ1IEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmFiYmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjEucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1FY2xpcHNlLUJ1ZGR5UG9saWN5OiByZWdpc3RlcmVkCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWE3N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTdmODliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBBbm5vdGF0aW9ucyBDb3JlCi1wbHVnaW5OYW1lPSBBbm5vdGF0aW9ucyBDb3JlIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyM2ZlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25DYXRlZ29yeSIgbmFtZT0iQW5ub3RhdGlvbiBDYXRlZ29yeSIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbkNhdGVnb3J5LmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25EZWZpbml0aW9uIiBuYW1lPSJBbm5vdGF0aW9uIERlZmluaXRpb24iIHNjaGVtYT0ic2NoZW1hL2Fubm90YXRpb25EZWZpbml0aW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25Jbml0aWFsaXplciIgbmFtZT0iQW5ub3RhdGlvbiBJbml0aWFsaXplciIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbkluaXRpYWxpemVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25Qcm9jZXNzb3IiIG5hbWU9IkFubm90YXRpb24gUHJvY2Vzc29yIiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uUHJvY2Vzc29yLmV4c2QiLz4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5Ij4KLSAgICAgIDxmYWN0b3JpZXMgZW5hYmxlRGVmYXVsdD0idHJ1ZSI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5Bbm5vdGF0aW9uc0NvcmVQcm9jZXNzb3JGYWN0b3J5Ij4KLSAgICAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDwvZmFjdG9yaWVzPgotICAgPC9leHRlbnNpb24+Ci0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkNhdGVnb3J5LmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uQ2F0ZWdvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4NTRiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uQ2F0ZWdvcnkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgaWQ9ImFubm90YXRpb25DYXRlZ29yeSIgbmFtZT0iQW5ub3RhdGlvbiBDYXRlZ29yeSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGNvbnRyaWJ1dGUgYW4gYW5ub3RhdGlvbiBjYXRlZ29yeS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNhdGVnb3J5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNhdGVnb3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBbiBhbm5vdGF0aW9uIGNhdGVnb3J5IGNvbnRyaWJ1dGlvbiBkZWZpbmVzIGNhdGVnb3JpZXMgb2YgYW5ub3RhdGlvbnMgdXNlZCB0byBncm91cCB0aGVtIGluIHRoZSBVSS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFubm90YXRpb24gY2F0ZWdvcnkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1cmUgYW5ub3RhdGlvbiBjYXRlb2dvcnkgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYW5ub3RhdGlvbiBjYXRlZ29yeSBjb250cmlidXRpb246Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5JnF1b3Q7Jmd0OwotICAgICAgJmx0O2NhdGVnb3J5Ci0gICAgICAgICAgICBpZD0mcXVvdDtqYXh3cy5jYXRlZ29yeSZxdW90OwotICAgICAgICAgICAgbmFtZT0mcXVvdDtKQVgtV1MmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2NhdGVnb3J5Jmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiAmbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkRlZmluaXRpb24uZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25EZWZpbml0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTI2NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkRlZmluaXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgaWQ9ImFubm90YXRpb25EZWZpbml0aW9uIiBuYW1lPSJBbm5vdGF0aW9uIERlZmluaXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gY29udHJpYnV0ZSBhbm5vdGF0aW9ucyAmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24mZ3Q7IHdoaWNoIGFyZSBpbiB0dXJuIGNvbnN1bWVkIGJ5IHRoZSBVSS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRhcmdldEZpbHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjciLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgYW5ub3RhdGlvbiBjbGFzcyBuYW1lIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uJmx0Oy9jb2RlJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWQgb2YgYSAmbHQ7dHQmZ3Q7YW5ub3RhdGlvbkNhdGVnb3J5Jmx0Oy90dCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImlkZW50aWZpZXIiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeS9jYXRlZ29yeS9AaWQiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXN0cmljdGVkVG8iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFVzZWQgaW4gYWRkaXRpb24gdG8gdGhlIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlKHMpIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgdmFsdWUgZWxlbWVudCBvZiB0aGUgIEBUYXJnZXQgYW5ub3RhdGlvbiBvbiB0aGUgY29udHJpYnV0ZWQgYW5ub3RhdGlvbiB0byBhZGQgZnVydGhlciByZXN0cmljdGlvbnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDTEFTU19PTkxZIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVEVSRkFDRV9PTkxZIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkVOVU1fT05MWSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idGFyZ2V0RmlsdGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgYW5ub3RhdGlvbnMgY29yZSBhdXRvbWF0aWNhbGx5IGtub3dzIHdoZXJlIHRvIHBlcm1pdCBhbm5vdGF0aW9ucyBhcyBpdCBpbnNwZWN0cyB0aGUgY29udHJpYnV0ZWQgYW5ub3RhdGlvbiBhbmQKLSAgICAgICAgICAgICAgICAgIHJlYWRzIHRoZSBAVGFyZ2V0IHRoYXQgaGFzIGJlZW4gZGVmaW5lZCBmb3IgaXQuIFRoZXNlIGZpbHRlcnMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZXJlIG1pZ2h0IGJlIGFuIGV4dHJhIHJlc3RyaWN0aW9uCi0gICAgICAgICAgICAgICAgICB5b3Ugd2FudCB0byBhZGQsIGZvciBleGFtcGxlLCBpZiB2ZXJzaW9uIDIgb2YgYW4gYW5ub3RhdGlvbiBhbGxvd3MgYWRkaW5nIHRoZSBhbm5vdGF0aW9uIHRvIGEgZmllbGQsIGFuZCB0aGVuIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgIDMgZGVwcmVjYXRlcyB0aGF0IHVzYWdlLCB5b3UgY2FuIGFkZCBhIGZpbHRlciBoZXJlIHRvIGRpc2FsbG93IHRoZSB1c2FnZSBpbiB0aGUgVUkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJUWVBFIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik1FVEhPRCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQQVJBTUVURVIiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ09OU1RSVUNUT1IiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTE9DQUxfVkFSSUFCTEUiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQU5OT1RBVElPTl9UWVBFIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlBBQ0tBR0UiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGFubm90YXRpb24gZGVmaW5pdGlvbiBjb250cmlidXRpb246Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb24mcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9JnF1b3Q7amF4d3MuY2F0ZWdvcnkmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2phdmF4Lmp3cy5XZWJTZXJ2aWNlJnF1b3Q7Ci0gICAgICAgICAgICBuYW1lPSZxdW90O1dlYlNlcnZpY2UmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2Fubm90YXRpb24mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuICZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkluaXRpYWxpemVyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllMWRiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgaWQ9ImFubm90YXRpb25Jbml0aWFsaXplciIgbmFtZT0iQW5ub3RhdGlvbiBJbml0aWFsaXplciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBhc3NvY2lhdGUgYW4gYW5ub3RhdGlvbiBpbml0aWFsaXplciB3aXRoIGFuIGFubm90YXRpb24gZGVmaW5pdGlvbi4KLQotVGhlIGFubm90YXRpb24gaW5pdGlhbGl6ZXJzIHJvbGUgaXMgdG8gY29uc3RydWN0IHZhbHVlcyBmb3IgdGhlIGFubm90YXRpb25zIG1lbWJlciB2YWx1ZSBwYWlycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImluaXRpYWxpemVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImluaXRpYWxpemVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiBkZWZpbml0aW9uIHRoYXQgdGhpcyBpbml0aWFsaXplcnMgaGFuZGxlcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImlkZW50aWZpZXIiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uL2Fubm90YXRpb24vQGNsYXNzIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY29udHJpYnV0ZWQgaW5pdGlhbGl6ZXIuIFRoZQotY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBhbmQgZXh0ZW5kCi0mbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYW5ub3RhdGlvbiBpbml0aWFsaXplciBjb250cmlidXRpb246Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkluaXRpYWxpemVyJnF1b3Q7Jmd0OwotICAgICAgJmx0O2luaXRpYWxpemVyCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSZxdW90O2phdmF4Lmp3cy5XZWJTZXJ2aWNlJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5XZWJTZXJ2aWNlQXR0cmlidXRlSW5pdGlhbGl6ZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2luaXRpYWxpemVyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiAmbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25Qcm9jZXNzb3IuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25Qcm9jZXNzb3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlZjY1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uUHJvY2Vzc29yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiIGlkPSJhbm5vdGF0aW9uUHJvY2Vzc29yIiBuYW1lPSJBbm5vdGF0aW9uIFByb2Nlc3NvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBjb250cmlidXRlIGFubm90YXRpb24gcHJvY2Vzb29ycy4gVGhlc2UgcHJvY2Vzc29ycyBhcmUgYXNzb2NpYXRlZCB3aXRoIGNvbnRyaWJ1dGVkIGFubm90YXRpb24gZGVmaW5pdGlvbnMuCi0KLVRoZSBnb2FsIG9mIHRoZSBwcm9jZXNzb3IgaXMgdG8gdmFsaWRhdGUgYW5ub3RhdGlvbiBydWxlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2Nlc3NvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzb3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFubm90YXRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFubm90YXRpb24gZGVmaW5pdGlvbiB0aGF0IHRoaXMgcHJvY2Vzc29yIGhhbmRsZXMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJpZGVudGlmaWVyIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbi9hbm5vdGF0aW9uL0BjbGFzcyIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGNvbnRyaWJ1dGVkIHByb2Nlc29yLiBUaGUKLWNsYXNzIG11c3QgYmUgYSBwdWJsaWMgc3ViY2xhc3Mgb2YKLSZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3ImbHQ7L2NvZGUmZ3Q7YW5kIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQW4gb3B0aW9uYWwgYXR0cmlidXRlIHRvIGhvbGQgYSBzaG9ydCB0ZXh0IGRlc2NyaWJpbmcgd2hhdCAmcXVvdDtydWxlJnF1b3Q7IHRoZSBwcm9jZXNzb3IgaGFuZGxlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZWxlbWVudD4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYW5ub3RhdGlvbiBwcm9jZXNzb3IgY29udHJpYnV0aW9uOgotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3ImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSZxdW90O2phdmF4Lmp3cy5XZWJTZXJ2aWNlJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VTRUlQcmVzZW50Tm9XZWJNZXRob2RSdWxlJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfU0VJX05PX1dFQk1FVEhPU19SVUxFCi0gICAgICAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICAgICAgJmx0Oy9wcm9jZXNzb3ImZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuICZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjgxOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOwotCi0vKioKLSAqIEFuIDxjb2RlPkFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiBjb250cmlidXRlZCB0aHJvdWdoIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+LAotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5PC9jb2RlPiBhbmQKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50cy4KLSAqIGZvciBhIDxjb2RlPmphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb248L2NvZGU+IGNsYXNzLgotICogPHA+Ci0gKiBJdCBzdXBwbGllcyB0aGUgYW5ub3RhdGlvbiBjbGFzcyBuYW1lLCBpdHMgYW5ub3RhdGlvbiBjYXRlZ29yeSwgdGhlIGFwcGxpY2FibGUgdGFyZ2V0cyBmb3IgdGhlIGFubm90YXRpb24KLSAqIGFuZCBhbiA8Y29kZT5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9jb2RlPiB0byBpbml0aWFsaXplIHRoZSBhbm5vdGF0aW9ucyBlbGVtZW50LXZhbHVlIHBhaXJzLgotICogPC9wPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1JFU1RSSUNURURfVE8gPSAicmVzdHJpY3RlZFRvIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1RSSUNURURfVE9fQ0xBU1NfT05MWSA9ICJDTEFTU19PTkxZIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVFJJQ1RFRF9UT19JTlRFUkZBQ0VfT05MWSA9ICJJTlRFUkZBQ0VfT05MWSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1RSSUNURURfVE9fRU5VTV9PTkxZID0gIkVOVU1fT05MWSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9UQVJHRVRfRklMVEVSID0gInRhcmdldEZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RBUkdFVCA9ICJ0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudDsKLSAgICBwcml2YXRlIFN0cmluZyBjYXRlZ29yeTsKLSAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uQ2xhc3NOYW1lOwotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzczsKLSAgICBwcml2YXRlIExpc3Q8RWxlbWVudFR5cGU+IHRhcmdldHM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkluaXRpYWxpemVyOwotICAgIHByaXZhdGUgU3RyaW5nIHJlc3RpY3RlZFRvOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbnRlcmZhY2VPbmx5OwotICAgIHByaXZhdGUgYm9vbGVhbiBjbGFzc09ubHk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVudW1Pbmx5OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiA8Y29kZT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gdXNpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUKLSAgICAgKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IGFuZCBjYXRlZ29yeSBuYW1lLgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uRWxlbWVudCB0aGUgPGNvZGU+YW5ub3RhdGlvbjwvY29kZT4gZWxlbWVudCBmcm9tIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50Ci0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBjYXRlZ29yeSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIEFubm90YXRpb25EZWZpbml0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLSAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCi0gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNsYXNzTmFtZSA9IEFubm90YXRpb25zTWFuYWdlci5nZXRBdHRyaWJ1dGVWYWx1ZShjb25maWd1cmF0aW9uRWxlbWVudCwgQVRUX0NMQVNTKTsKLSAgICAgICAgdGhpcy5uYW1lID0gQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEF0dHJpYnV0ZVZhbHVlKGNvbmZpZ3VyYXRpb25FbGVtZW50LCBBVFRfTkFNRSk7Ci0gICAgICAgIHRoaXMucmVzdGljdGVkVG8gPSBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QXR0cmlidXRlVmFsdWUoY29uZmlndXJhdGlvbkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgQVRUX1JFU1RSSUNURURfVE8pOwotICAgICAgICB0aGlzLmNsYXNzT25seSA9IHJlc3RpY3RlZFRvLmVxdWFscyhSRVNUUklDVEVEX1RPX0NMQVNTX09OTFkpOwotICAgICAgICB0aGlzLmludGVyZmFjZU9ubHkgPSByZXN0aWN0ZWRUby5lcXVhbHMoUkVTVFJJQ1RFRF9UT19JTlRFUkZBQ0VfT05MWSk7Ci0gICAgICAgIHRoaXMuZW51bU9ubHkgPSByZXN0aWN0ZWRUby5lcXVhbHMoUkVTVFJJQ1RFRF9UT19FTlVNX09OTFkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFubm90YXRpb24gbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXRlZ29yeSB0aGUgYW5ub3RhdGlvbiBiZWxvbmdzIHRvLgotICAgICAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gY2F0ZWdvcnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLSAgICAgICAgcmV0dXJuIGNhdGVnb3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbkNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gY2xhc3MgdHlwZXMuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGNsYXNzZXMgb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzT25seSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzT25seTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBpbnRlcmZhY2UgdHlwZXMuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGludGVyZmFjZXMgb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZU9ubHkoKSB7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VPbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGVudW0gdHlwZXMuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGVudW1zIG9ubHkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbnVtT25seSgpIHsKLSAgICAgICAgcmV0dXJuIGVudW1Pbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFubm90YXRpb24gY2xhc3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5jbGFzczwvY29kZT4gYXR0cmlidXRlIG9mIHRoZQotICAgICAqIDxjb2RlPmFubm90YXRpb248YW5ub3RhdGlvbj4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+Ci0gICAgICogZXh0ZW5zaW9uIHBvaW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBjbGFzcwotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbkNsYXNzKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gYUNsYXNzID0gQ2xhc3MuZm9yTmFtZShhbm5vdGF0aW9uQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYUNsYXNzLmlzQW5ub3RhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25DbGFzcyA9IChDbGFzczxqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPilDbGFzcy5mb3JOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25DbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhjbmZlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHtAbGluayBFbGVtZW50VHlwZX0gdGhhdCBzcGVjaWZ5IHRoZSBKYXZhIGVsZW1lbnRzIHRvIHdoaWNoIHRoZSBhbm5vdGF0aW9uCi0gICAgICogY2FuIGJlIGFwcGxpZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGVsZW1lbnQgdHlwZXMgYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBhbm5vdGF0aW9ucwotICAgICAqIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXR9IG1ldGEtYW5ub3RhdGlvbiB0eXBlLiBUaGlzIGxpc3QgY2FuIGJlIGZpbHRlcmVkIHVzaW5nCi0gICAgICogdGhlIDxjb2RlPnRhcmdldEZpbHRlcjwvY29kZT4gZWxlbWVudCBvbiB0aGUKLSAgICAgKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IHdoZW4gZGVmaW5pbmcKLSAgICAgKiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZWxlbWVudCB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxFbGVtZW50VHlwZT4gZ2V0VGFyZ2V0cygpIHsKLSAgICAgICAgaWYgKHRhcmdldHMgPT0gbnVsbCkgewotICAgICAgICAJdGFyZ2V0cyA9IG5ldyBMaW5rZWRMaXN0PEVsZW1lbnRUeXBlPigpOwotCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb25DbGFzcygpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgCVRhcmdldCB0YXJnZXQgPSBhbm5vdGF0aW9uLmdldEFubm90YXRpb24oVGFyZ2V0LmNsYXNzKTsKLSAgICAgICAgICAgIAlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIAkgICAgdGFyZ2V0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0YXJnZXQudmFsdWUoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8RWxlbWVudFR5cGU+IGZpbHRlcmVkVGFyZ2V0cyA9IGdldEZpbHRlcmVkVGFyZ2V0cyhjb25maWd1cmF0aW9uRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRzLmNvbnRhaW5zQWxsKGZpbHRlcmVkVGFyZ2V0cykgJiYgZmlsdGVyZWRUYXJnZXRzLnNpemUoKSA8IHRhcmdldHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZUFsbChmaWx0ZXJlZFRhcmdldHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0YXJnZXRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFubm90YXRpb25zIGF0dHJpYnV0ZSBpbml0aWFsaXplciBhcyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkluaXRpYWxpemVyPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgb3IgbnVsbCBpZiBubwotICAgICAqIGluaXRpYWxpemVyIGNhbiBiZSBmb3VuZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkluaXRpYWxpemVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25Jbml0aWFsaXplckNhY2hlKCkuZ2V0KGdldEFubm90YXRpb25DbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkluaXRpYWxpemVyID0gKElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIpY29uZmlndXJhdGlvbkVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uSW5pdGlhbGl6ZXI7Ci0gICAgfQotCi0JICBwcml2YXRlIExpc3Q8RWxlbWVudFR5cGU+IGdldEZpbHRlcmVkVGFyZ2V0cyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJICBMaXN0PEVsZW1lbnRUeXBlPiB0YXJnZXRzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50VHlwZT4oNyk7Ci0JCSAgdHJ5IHsKLQkJCSAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZGVwcmVjYXRlZFRhcmdldHMgPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXRDaGlsZHJlbihFTEVNX1RBUkdFVF9GSUxURVIpOwotCQkJICBmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBkZXByZWNhdGVkVGFyZ2V0RWxlbWVudCA6IGRlcHJlY2F0ZWRUYXJnZXRzKSB7Ci0JCQkJICBTdHJpbmcgdGFyZ2V0ID0gQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEF0dHJpYnV0ZVZhbHVlKGRlcHJlY2F0ZWRUYXJnZXRFbGVtZW50LCBBVFRfVEFSR0VUKTsKLQkJCQkgIHRhcmdldHMuYWRkKEVsZW1lbnRUeXBlLnZhbHVlT2YodGFyZ2V0KSk7Ci0JCQkgIH0KLQkJICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQkgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2coaWFlKTsKLQkJICB9Ci0JCSAgcmV0dXJuIHRhcmdldHM7Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2VmMGI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBjcmVhdGluZyBhbm5vdGF0aW9ucyBhbmQgbWVtYmVyIHZhbHVlIHBhaXJzLgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFubm90YXRpb25zQ29yZSB7Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25zQ29yZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBOb3JtYWxBbm5vdGF0aW9ufS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpcnMgYSBsaXN0IG9mIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHRvIGFkZCB0byB0aGUgbm9ybWFsIGFubm90YXRpb24uCi0gICAgICogQHJldHVybiBhIG5vcm1hbCBhbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIG1lbWJlciB2YWx1ZSBwYWlycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE5vcm1hbEFubm90YXRpb24gY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgIE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0KLSAgICAgICAgTmFtZSBhbm5vdGF0aW9uVHlwZU5hbWUgPSBhc3QubmV3TmFtZShhbm5vdGF0aW9uTmFtZSk7Ci0KLSAgICAgICAgYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShhbm5vdGF0aW9uVHlwZU5hbWUpOwotCi0gICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gYW5ub3RhdGlvblZhbHVlcyA9IGFubm90YXRpb24udmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvblZhbHVlcy5hZGQobWVtYmVyVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTaW5nbGVNZW1iZXJBbm5vdGF0aW9ufS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB7QGxpbmsgRXhwcmVzc2lvbn0gdG8gc2V0IGFzIHRoZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gdmFsdWUuCi0gICAgICogQHJldHVybiBhIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gY3JlYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIEV4cHJlc3Npb24gdmFsdWUpIHsKLSAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQotICAgICAgICBOYW1lIGFubm90YXRpb25UeXBlTmFtZSA9IGFzdC5uZXdOYW1lKGFubm90YXRpb25OYW1lKTsKLQotICAgICAgICBhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGFubm90YXRpb25UeXBlTmFtZSk7Ci0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgCXZhbHVlID0gKEV4cHJlc3Npb24pRXhwcmVzc2lvbi5jb3B5U3VidHJlZShhc3QsIHZhbHVlKTsKLSAgICAgICAgCWFubm90YXRpb24uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWFya2VyQW5ub3RhdGlvbn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIGFubm90YXRpb25OYW1lIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEByZXR1cm4gYSBtYXJrZXIgYW5ub3RhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcmtlckFubm90YXRpb24gY3JlYXRlTWFya2VyQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLSAgICAgICAgTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld01hcmtlckFubm90YXRpb24oKTsKLQotICAgICAgICBOYW1lIGFubm90YXRpb25UeXBlTmFtZSA9IGFzdC5uZXdOYW1lKGFubm90YXRpb25OYW1lKTsKLQotICAgICAgICBhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGFubm90YXRpb25UeXBlTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9ICJuYW1lIi4KLSAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUge0BsaW5rIEV4cHJlc3Npb259ICJ2YWx1ZSIgb2YgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA9IGFzdC5uZXdNZW1iZXJWYWx1ZVBhaXIoKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlyLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUobmFtZSkpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuc2V0VmFsdWUoZXhwcmVzc2lvbik7Ci0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIGEge0BsaW5rIFN0cmluZ0xpdGVyYWx9IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiAidmFsdWUiLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0cmluZ01lbWJlclZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLAotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSkpOwotCi0gICAgICAgIHJldHVybiBzdHJpbmdNZW1iZXJWYWx1ZVBhaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIGEge0BsaW5rIEJvb2xlYW5MaXRlcmFsfSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyICJuYW1lIi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIDxjb2RlPkJvb2xlYW48L2NvZGU+ICJ2YWx1ZSIuCi0gICAgICogQHJldHVybiBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBCb29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIE1lbWJlclZhbHVlUGFpciBib29sZWFuVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIEFubm90YXRpb25zQ29yZQotICAgICAgICAgICAgICAgIC5jcmVhdGVCb29sZWFuTGl0ZXJhbChhc3QsIHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIGJvb2xlYW5WYWx1ZVBhaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIGEge0BsaW5rIE51bWJlckxpdGVyYWx9IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiAidmFsdWUiIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlTnVtYmVyTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHByaW1pdGl2ZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLAotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZS5jcmVhdGVOdW1iZXJMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWVQYWlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gd2l0aCBhIHtAbGluayBOYW1lfSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgZW5jbG9zaW5nIGNsYXNzIG5hbWUuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyICJuYW1lIi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgPGNvZGU+ZW51bTwvY29kZT4gdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIGNyZWF0ZUVudW1MaXRlcmFsKGFzdCwgY2xhc3NOYW1lLCB2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gd2l0aCBhIHtAbGluayBUeXBlTGl0ZXJhbH0gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZW1iZXIgdmFsdWUgcGFpciAibmFtZSIuCi0gICAgICogQHBhcmFtIHZhbHVlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHR5cGUgdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVUeXBlTWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLAotICAgICAgICAgICAgICAgIGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHdpdGggYW4ge0BsaW5rIEFycmF5SW5pdGlhbGl6ZXJ9IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIGEge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IG1lbWJlci4KLSAgICAgKiBAcGFyYW0gdmFsdWVzIGFuIGFycmF5IG9mIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWVzLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgYXJyYXkgb2YgdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIHZhbHVlcykgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG1ldGhvZC5nZXROYW1lKCksIGNyZWF0ZUFycmF5VmFsdWVMaXRlcmFsKGFzdCwKLSAgICAgICAgICAgICAgICBtZXRob2QsIHZhbHVlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEFycmF5SW5pdGlhbGl6ZXJ9LgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUge0BsaW5rIEFycmF5SW5pdGlhbGl6ZXJ9LgotICAgICAqIEBwYXJhbSBtZXRob2QgYSB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gbWVtYmVyLgotICAgICAqIEBwYXJhbSB2YWx1ZXMgYW4gYXJyYXkgb2YgPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZXMuCi0gICAgICogQHJldHVybiBhIG5ldyBzcnJheSBpbml0aWFsaXplci4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIEFycmF5SW5pdGlhbGl6ZXIgY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwoQVNUIGFzdCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gdmFsdWVzKSB7Ci0gICAgICAgIEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPIEhhbmRsZSB0aGlzIHNpdHVhdGlvbi4gQXJpc2VzIHdoZW4gYW5ub3RhdGlvbnMgYXJlIHNwZWNpZmllZCBhcyBkZWZhdWx0cyBpbiBhcnJheSBpbml0aWFsaXplcnMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vTGlzdCBvZiB2YWx1ZXMuIFVzZWQgYnkgdGhlIGFubm90YXRpb24gYXJyYXkgY2VsbCBlZGl0b3Igd2hlbiBhZGRpbmcgYW5ub3RhdGlvbnMKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzID0KLSAgICAgICAgICAgICAgICAgKENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPikgbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgICAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXNMaXN0ID0gKExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4pIHZhbHVlOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlc0l0ZXJhdG9yID0gdmFsdWVzTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlICh2YWx1ZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBhbm5vdGF0aW9uTWFwID0gdmFsdWVzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTZXQ8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyeVNldCA9IGFubm90YXRpb25NYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gaXRlcmF0b3IgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk8amF2YS5sYW5nLlN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZW1iZXJOYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBhbm5vdGF0aW9uTWV0aG9kID0gYW5ub3RhdGlvbkNsYXNzLmdldE1ldGhvZChtZW1iZXJOYW1lLCBuZXcgQ2xhc3NbMF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1lbWJlclZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IGFubm90YXRpb25NZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWVtYmVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChjcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWVtYmVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJvb2xlYW4pIG1lbWJlclZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG1lbWJlclZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG1lbWJlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgY2xhc3NOYW1lKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChnZXROdW1iZXJNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZW1iZXJOYW1lLCBtZW1iZXJWYWx1ZSkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2cobnNtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChjcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChjcmVhdGVUeXBlTGl0ZXJhbChhc3QsIHZhbHVlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZ1ZhbHVlLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotICAgICAgICAgICAgICAgICAgICBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgc3RyaW5nVmFsdWUuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWUubGFzdEluZGV4T2YoIi4iKSkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKGNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCBzdHJpbmdWYWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXlJbml0aWFsaXplcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBRdWFsaWZpZWROYW1lfSB0byByZXByZXNlbnQgYW4gPGNvZGU+ZW51bTwvY29kZT4gbGl0ZXJhbCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcXVhbGlmaWVkIG5hbWUuCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcy4KLSAgICAgKiBAcGFyYW0gdmFsdWUgc24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgPGNvZGU+ZW51bTwvY29kZT4gdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBxdWFsaWZpZWQgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFF1YWxpZmllZE5hbWUgY3JlYXRlRW51bUxpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIGNsYXNzTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFF1YWxpZmllZE5hbWUgZW51bU5hbWUgPSBudWxsOwotICAgICAgICBTaW1wbGVOYW1lIGVudW1DbGFzc05hbWUgPSBhc3QubmV3U2ltcGxlTmFtZSh2YWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIFNpbXBsZU5hbWUgZW51bUxpdGVyYWwgPSBhc3QubmV3U2ltcGxlTmFtZSh2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKHZhbHVlLmdldENsYXNzKCkuaXNNZW1iZXJDbGFzcygpKSB7Ci0gICAgICAgICAgICBOYW1lIGVudW1FbmNsb3NpbmdDbGFzc05hbWUgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGVuY2xvc2luZ0NsYXNzTmFtZSA9IHZhbHVlLmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nQ2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZW5jbG9zaW5nQ2xhc3NOYW1lLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZW51bUVuY2xvc2luZ0NsYXNzTmFtZSA9IGFzdC5uZXdTaW1wbGVOYW1lKHZhbHVlLmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nQ2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVudW1FbmNsb3NpbmdDbGFzc05hbWUgPSBhc3QubmV3TmFtZShlbmNsb3NpbmdDbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gYXN0Lm5ld1F1YWxpZmllZE5hbWUoZW51bUVuY2xvc2luZ0NsYXNzTmFtZSwgZW51bUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBlbnVtTmFtZSA9IGFzdC5uZXdRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIGVudW1MaXRlcmFsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE5hbWUgcXVhbGlmaWVkTmFtZSA9IGFzdC5uZXdOYW1lKHZhbHVlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIGVudW1OYW1lID0gYXN0Lm5ld1F1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgZW51bUxpdGVyYWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnVtTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUeXBlTGl0ZXJhbH0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHtAbGluayBUeXBlTGl0ZXJhbH0uCi0gICAgICogQHBhcmFtIHZhbHVlIGEgPGNvZGU+Q2xhc3M8L2NvZGU+IG9yIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdHlwZSBsaXRlcmFsLgotICAgICAqIEByZXR1cm4gYSBuZXcgdHlwZSBsaXRlcmFsIG9yIG51bGwgaXQgdGhlIHZhbHVlIGlzIG5vdCBvZiB0eXBlIDxjb2RlPkNsYXNzPC9jb2RlPiBvciA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHlwZUxpdGVyYWwgY3JlYXRlVHlwZUxpdGVyYWwoQVNUIGFzdCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFR5cGVMaXRlcmFsIHR5cGVMaXRlcmFsID0gbnVsbDsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIHR5cGVMaXRlcmFsID0gY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCAoQ2xhc3M8Pz4pIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHR5cGVMaXRlcmFsID0gY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVMaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFR5cGVMaXRlcmFsfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdHlwZSBsaXRlcmFsLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgY2xhc3MgdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyB0eXBlIGxpdGVyYWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUeXBlTGl0ZXJhbCBjcmVhdGVUeXBlTGl0ZXJhbChBU1QgYXN0LCBDbGFzczw/PiB2YWx1ZSkgewotICAgICAgICBUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCi0gICAgICAgIENsYXNzPD8+IGFDbGFzcyA9IHZhbHVlOwotICAgICAgICBTaW1wbGVOYW1lIGNsYXNzTmFtZSA9IGFzdC5uZXdTaW1wbGVOYW1lKGFDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCi0gICAgICAgIGlmIChhQ2xhc3MuaXNNZW1iZXJDbGFzcygpKSB7Ci0gICAgICAgICAgICBOYW1lIGVuY2xvc2luZ0NsYXNzTmFtZSA9IGFzdC5uZXdOYW1lKGFDbGFzcy5nZXRFbmNsb3NpbmdDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgICAgICBRdWFsaWZpZWRUeXBlIHF1YWxpZmllZFR5cGUgPSBhc3QubmV3UXVhbGlmaWVkVHlwZShhc3QubmV3U2ltcGxlVHlwZShlbmNsb3NpbmdDbGFzc05hbWUpLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgdHlwZUxpdGVyYWwuc2V0VHlwZShxdWFsaWZpZWRUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiB0eXBlTGl0ZXJhbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCB2YWx1ZS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFR5cGVMaXRlcmFsfQotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB0eXBlIGxpdGVyYWwuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IHR5cGUgbGl0ZXJhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVMaXRlcmFsIGNyZWF0ZVR5cGVMaXRlcmFsKEFTVCBhc3QsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCi0gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCIuIikgPT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdHlwZUxpdGVyYWwuc2V0VHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3U2ltcGxlTmFtZSh2YWx1ZSkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWFsaWZpZXIgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGFzdEluZGV4T2YoIi4iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFN0cmluZyBpZGVudGlmaWVyID0gdmFsdWUuc3Vic3RyaW5nKHZhbHVlLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKHF1YWxpZmllci5lcXVhbHMoImphdmEubGFuZyIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB0eXBlTGl0ZXJhbC5zZXRUeXBlKGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKGlkZW50aWZpZXIpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHR5cGVMaXRlcmFsLnNldFR5cGUoYXN0Lm5ld1F1YWxpZmllZFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld05hbWUocXVhbGlmaWVyKSksIGFzdAotICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1NpbXBsZU5hbWUoaWRlbnRpZmllcikpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZUxpdGVyYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgU3RyaW5nTGl0ZXJhbH0uCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBzdHJpbmcgbGl0ZXJhbC4KLSAgICAgKiBAcGFyYW0gbGl0ZXJhbFZhbHVlIHRoZSBzdHJpbmcgdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBzdHJpbmcgbGl0ZXJhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0xpdGVyYWwgY3JlYXRlU3RyaW5nTGl0ZXJhbChBU1QgYXN0LCBTdHJpbmcgbGl0ZXJhbFZhbHVlKSB7Ci0gICAgICAgIFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0gICAgICAgIHN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKGxpdGVyYWxWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBzdHJpbmdMaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEJvb2xlYW5MaXRlcmFsfS4KLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGJvb2xlYW4gbGl0ZXJhbC4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBib29sZWFuIGxpdGVyYWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCb29sZWFuTGl0ZXJhbCBjcmVhdGVCb29sZWFuTGl0ZXJhbChBU1QgYXN0LCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIEJvb2xlYW5MaXRlcmFsIGJvb2xlYW5MaXRlcmFsID0gYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGJvb2xlYW5MaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE51bWJlckxpdGVyYWx9LgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUge0BsaW5rIE51bWJlckxpdGVyYWx9LgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbnVtYmVyIHZhbHVlLgotICAgICAqIEByZXR1cm4gYSBuZXcgbnVtYmVyIGxpdGVyYWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOdW1iZXJMaXRlcmFsIGNyZWF0ZU51bWJlckxpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIE51bWJlckxpdGVyYWwgcHJpbWl0aXZlTGl0ZXJhbCA9IGFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0gICAgICAgIHByaW1pdGl2ZUxpdGVyYWwuc2V0VG9rZW4odmFsdWUpOwotICAgICAgICByZXR1cm4gcHJpbWl0aXZlTGl0ZXJhbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA0Njc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIAotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyAKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbnNDb3JlUGx1Z2luIHBsdWdpbjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25zQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MGZlNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBhbm5vdGF0aW9uIGNhdGVnb3JpZXMsIGRlZmluaXRpb25zLCBwcm9jZXNzb3JzIGFuZCBpbml0aWFsaXplcnMgY29udHJpYnV0ZWQgdGhyb3VnaCB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiwKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeTwvY29kZT4sCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGFuZAotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50cy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uc01hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0RFRklOSVRJT04gPSAiYW5ub3RhdGlvbkRlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fQ0FURUdPUlkgPSAiYW5ub3RhdGlvbkNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0lOSVRJQUxJWkVSID0gImFubm90YXRpb25Jbml0aWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9QUk9DRVNTT1IgPSAiYW5ub3RhdGlvblByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTiA9ICJhbm5vdGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkNhY2hlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGFubm90YXRpb25DYXRlZ29yeUNhY2hlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGFubm90YXRpb25Jbml0aWFsaXplckNhY2hlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGFubm90YXRpb25Qcm9jZXNzb3JDYWNoZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4+IGFubm90YXRpb25zQnlDYXRlZ29yeU1hcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25DbGFzc05hbWVUb0RlZmluaXRpb25NYXA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uUXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1RBUkdFVF9GSUxURVIgPSAidGFyZ2V0RmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVEFSR0VUID0gInRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNNYW5hZ2VyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHtAbGluayBBbm5vdGF0aW9uRGVmaW5pdGlvbn0gY29uc3RydWN0ZWQgZnJvbSBjb250cmlidXRpb25zIHRvIHRoZQotICAgICAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbm5vdGF0aW9uIGRlZmluaXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25zKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkNhY2hlID09IG51bGwpIHsKLSAgICAgICAgICAgIGFubm90YXRpb25DYWNoZSA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEFOTk9UQVRJT05fREVGSU5JVElPTik7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZXh0ZW5zaW9uUG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEFOTk9UQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IG5ldyBBbm5vdGF0aW9uRGVmaW5pdGlvbihlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uQ2F0ZWdvcnkoZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgQVRUX0NBVEVHT1JZKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNhY2hlLmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DYWNoZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGNvbnRyaWJ1dGVkIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSB0aGF0IHRhcmdldCB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50IHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCBvbmUgb2YKLSAgICAgKiA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjwvbGk+Ci0gICAgICogPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlPC9saT4KLSAgICAgKiA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkPC9saT4KLSAgICAgKiA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDwvbGk+Ci0gICAgICogPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlPC9saT4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFubm90YXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGdldEFubm90YXRpb25zKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgewotICAgICAgICBMaXN0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4oKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gZ2V0QWxsQW5ub3RhdGlvbnNGb3JFbGVtZW50KGphdmFFbGVtZW50KTsKLQotICAgICAgICAgICAgZmlsdGVyQW5ub3RhdGlvbnNMaXN0KGphdmFFbGVtZW50LCBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpOwotCi0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uIDogYW5ub3RhdGlvbkRlZmluaXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25DbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25Ub0NsYXNzTmFtZURlZmluaXRpb25NYXAoKSB7Ci0KLSAgICAgICAgaWYgKGFubm90YXRpb25DbGFzc05hbWVUb0RlZmluaXRpb25NYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gZ2V0QW5ub3RhdGlvbnMoKTsKLQotICAgICAgICAgICAgYW5ub3RhdGlvbkNsYXNzTmFtZVRvRGVmaW5pdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwLnB1dChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uQ2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENhbm9uaWNhbE5hbWUoKSwgYW5ub3RhdGlvbkRlZmluaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0U2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcCgpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucyA9IGdldEFubm90YXRpb25zKCk7Ci0KLSAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25EZWZpbml0aW9ucykgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwLnB1dChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXROYW1lKCksIGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblNpbXBsZU5hbWVUb0RlZmluaXRpb25NYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBnZXRRdWFsaWZpZWROYW1lVG9EZWZpbml0aW9uTWFwKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gZ2V0QW5ub3RhdGlvbnMoKTsKLQotICAgICAgICAgICAgYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPigpOwotCi0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uIDogYW5ub3RhdGlvbkRlZmluaXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAucHV0KGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25DbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEFubm90YXRpb25EZWZpbml0aW9ufSBmb3IgdGhlIGdpdmVuIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcwotICAgICAqIG9yIG51bGwgaWYgbm8gYW5ub3RhdGlvbiBkZWZpbml0aW9uIGNhbiBiZSBmb3VuZC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbkNsYXNzIHRoZSA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIGRlZmluaXRpb24gZm9yIHRoZSA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvblRvQ2xhc3NOYW1lRGVmaW5pdGlvbk1hcCgpLmdldChhbm5vdGF0aW9uQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW5ub3RhdGlvbkRlZmluaXRpb259IGZvciB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcwotICAgICAqIG5hbWUgb3IgbnVsbCBpZiBubyBhbm5vdGF0aW9uIGRlZmluaXRpb24gY2FuIGJlIGZvdW5kLgotICAgICAqIEBwYXJhbSBjYW5vbmljYWxOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgPGNvZGU+amF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjwvY29kZT4gY2xhc3MuCi0gICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBkZWZpbml0aW9uIGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIDxjb2RlPmphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb248L2NvZGU+IGNsYXNzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKFN0cmluZyBjYW5vbmljYWxOYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uVG9DbGFzc05hbWVEZWZpbml0aW9uTWFwKCkuZ2V0KGNhbm9uaWNhbE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyfSBmb3IgdGhlIGdpdmVuIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZX0KLSAgICAgKiBvciBudWxsIGlmIG5vbmUgY2FuIGJlIGZvdW5kLgotICAgICAqIEBwYXJhbSBuYW1lIGEge0BsaW5rIFNpbXBsZU5hbWV9IG9yIHtAbGluayBRdWFsaWZpZWROYW1lfSBmb3IgdGhlIGFubm90YXRpb24gdG8gc2VhcmNoIGZvci4KLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyRm9yTmFtZShOYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5hbWUuaXNTaW1wbGVOYW1lKCkgJiYgZ2V0U2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcCgpLmNvbnRhaW5zS2V5KCgoU2ltcGxlTmFtZSkgbmFtZSkuZ2V0SWRlbnRpZmllcigpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwKCkuZ2V0KCgoU2ltcGxlTmFtZSkgbmFtZSkuZ2V0SWRlbnRpZmllcigpKS5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5pc1F1YWxpZmllZE5hbWUoKSAmJiBnZXRRdWFsaWZpZWROYW1lVG9EZWZpbml0aW9uTWFwKCkuY29udGFpbnNLZXkobmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcCgpLmdldChuYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKS5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHtAbGluayBBbm5vdGF0aW9uRGVmaW5pdGlvbn0gd2l0aCB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBjYXRlZ29yeSBuYW1lLgotICAgICAqIEBwYXJhbSBjYXRlZ29yeU5hbWUgdGhlIGFubm90YXRpb24gY2F0ZWdvcnkgbmFtZS4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbm5vdGF0aW9uIGRlZmluaXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25zQnlDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uc0J5Q2F0ZWdvcnlNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub3RhdGlvbnNCeUNhdGVnb3J5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPj4oKTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBnZXRBbm5vdGF0aW9ucygpKSB7Ci0KLSAgICAgICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QgPSBhbm5vdGF0aW9uc0J5Q2F0ZWdvcnlNYXAuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0Q2F0ZWdvcnkoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0LmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zQnlDYXRlZ29yeU1hcC5wdXQoYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0Q2F0ZWdvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0LmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zQnlDYXRlZ29yeU1hcC5nZXQoY2F0ZWdvcnlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yaWVzLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFubm90YXRpb24gY2F0ZWdvcmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBbm5vdGF0aW9uQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS52YWx1ZXMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS5zaXplKCldKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFubm90YXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlJZCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS5nZXQoY2F0ZWdvcnlJZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGU7Ci0gICAgICAgIH0KLQotICAgICAgICBhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQU5OT1RBVElPTl9DQVRFR09SWSk7Ci0gICAgICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUucHV0KGdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIEFUVF9JRCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBVFRfTkFNRSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGdldEFubm90YXRpb25Jbml0aWFsaXplckNhY2hlKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25Jbml0aWFsaXplckNhY2hlOwotICAgICAgICB9Ci0KLSAgICAgICAgYW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQotICAgICAgICBJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KAotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEFOTk9UQVRJT05fSU5JVElBTElaRVIpOwotICAgICAgICBpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotICAgICAgICAgICAgICAgIGFubm90YXRpb25Jbml0aWFsaXplckNhY2hlLnB1dChnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBTk5PVEFUSU9OKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGdldEFubm90YXRpb25Qcm9jZXNzb3JzQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+KCk7Ci0KLSAgICAgICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEFOTk9UQVRJT05fUFJPQ0VTU09SKTsKLSAgICAgICAgICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJwcm9jZXNzb3IiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25LZXkgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBTk5PVEFUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjb25maWd1cmF0aW9uRWxlbWVudHMgPSBhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uRWxlbWVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlLnB1dChhbm5vdGF0aW9uS2V5LCBjb25maWd1cmF0aW9uRWxlbWVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IGNvbmZpZ3VyYXRpb25FbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFsbEFubm90YXRpb25zRm9yRWxlbWVudChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpCi0gICAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuUEFDS0FHRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBpZiAodHlwZS5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5UWVBFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkgewotICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuRklFTEQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuTUVUSE9EKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElMb2NhbFZhcmlhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5QQVJBTUVURVIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUFubm90YXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPigpOwotCi0gICAgICAgIGlmIChhbm5vdGF0aW9uQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBhbm5vdGF0aW9uQ2FjaGUpIHsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRUYXJnZXRzKCkuY29udGFpbnMoZWxlbWVudFR5cGUpICYmCi0gICAgICAgICAgICAgICAgICAgICFpc0RlcHJlY2F0ZWQoYW5ub3RhdGlvbkRlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25zLmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpbHRlckFubm90YXRpb25zTGlzdChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBJdGVyYXRvcjxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkl0ZXIgPSBhbm5vdGF0aW9uRGVmaW5pdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGFubm90YXRpb25JdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSBhbm5vdGF0aW9uSXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0gICAgICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQ2xhc3NSZXN0cmljdGVkKHR5cGUsIGFubm90YXRpb25EZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNJbnRlcmZhY2VSZXN0cmljdGVkKHR5cGUsIGFubm90YXRpb25EZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNFbnVtUmVzdHJpY3RlZCh0eXBlLCBhbm5vdGF0aW9uRGVmaW5pdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChtZXRob2QuaXNNYWluTWV0aG9kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0VGFyZ2V0cygpLmNvbnRhaW5zKEVsZW1lbnRUeXBlLkNPTlNUUlVDVE9SKSkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNDbGFzc1Jlc3RyaWN0ZWQobWV0aG9kLCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzSW50ZXJmYWNlUmVzdHJpY3RlZChtZXRob2QsIGFubm90YXRpb25EZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNFbnVtUmVzdHJpY3RlZChtZXRob2QsIGFubm90YXRpb25EZWZpbml0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkgewotICAgICAgICAgICAgICAgIGlmKGlzQ2xhc3NSZXN0cmljdGVkKGphdmFFbGVtZW50LCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzSW50ZXJmYWNlUmVzdHJpY3RlZChqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fGlzRW51bVJlc3RyaWN0ZWQoamF2YUVsZW1lbnQsIGFubm90YXRpb25EZWZpbml0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NSZXN0cmljdGVkKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLSAgICAgICAgICAgIHJldHVybiAhKChJVHlwZSlqYXZhRWxlbWVudCkuaXNDbGFzcygpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzQ2xhc3NPbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAhdHlwZS5pc0NsYXNzKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNDbGFzc09ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gIXR5cGUuaXNDbGFzcygpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzQ2xhc3NPbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbnRlcmZhY2VSZXN0cmljdGVkKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLSAgICAgICAgICAgIHJldHVybiAhKChJVHlwZSlqYXZhRWxlbWVudCkuaXNJbnRlcmZhY2UoKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0ludGVyZmFjZU9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzSW50ZXJmYWNlKCkgICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzSW50ZXJmYWNlT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAhdHlwZS5pc0ludGVyZmFjZSgpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzSW50ZXJmYWNlT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW51bVJlc3RyaWN0ZWQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgcmV0dXJuICEoKElUeXBlKWphdmFFbGVtZW50KS5pc0VudW0oKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0VudW1Pbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAhdHlwZS5pc0VudW0oKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0VudW1Pbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzRW51bSgpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzRW51bU9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy9UT0RPIE1vdmUgdGhlIERlcHJlY2F0ZWQgb3B0aW9uIHRvIHByZWZlcmVuY2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RlcHJlY2F0ZWQoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHsKLSAgICAgICAgQ2xhc3M8Pz4gYW5ub3RhdGlvbkNsYXNzID0gYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbkNsYXNzKCk7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2xhc3MuZ2V0QW5ub3RhdGlvbihqYXZhLmxhbmcuRGVwcmVjYXRlZC5jbGFzcykgIT0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmI0MzExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgaW5pdGlhbGl6ZXJzIGNvbnRyaWJ1dGVkIHRvIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkluaXRpYWxpemVyPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8cD4KLSAqIFByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBhbGwgbWV0aG9kcy4KLSAqIDwvcD4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQKLSAqIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UKLSAqIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwKLSAqIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKgotKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfSURFTlRJRkVSID0gIiRtaXNzaW5nJCI7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyI2dldE1lbWJlclZhbHVlUGFpcnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIjZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXIpCi0JICovCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyI2dldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb24pCi0JICovCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb24oSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcHJvcG9zYWwsIEV4cHJlc3Npb24gdmFsdWUpIHsKLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXMuSU1HX09CSl9GSUxFKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCwgdmFsdWUsIGltYWdlLCBwcm9wb3NhbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoU3RyaW5nIHByb3Bvc2FsLCBFeHByZXNzaW9uIHZhbHVlLCBJbWFnZSBpbWFnZSwKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0gICAgICAgIGludCByZXBsYWNlbWVudE9mZnNldCA9IHZhbHVlLmdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICAgICAgaW50IHJlcGxhY2VtZW50TGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKE1JU1NJTkdfSURFTlRJRkVSKSkgewotICAgICAgICAgICAgaWYgKHByb3Bvc2FsLmNoYXJBdCgwKSAhPSAnXCInKSB7Ci0gICAgICAgICAgICAgICAgcHJvcG9zYWwgPSAiXCIiICsgcHJvcG9zYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvcG9zYWwuY2hhckF0KHByb3Bvc2FsLmxlbmd0aCgpIC0gMSkgIT0gJ1wiJykgewotICAgICAgICAgICAgICAgIHByb3Bvc2FsID0gcHJvcG9zYWwgKyAiXCIiOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVwbGFjZW1lbnRPZmZzZXQgKz0gMTsKLSAgICAgICAgICAgIHJlcGxhY2VtZW50TGVuZ3RoID0gdmFsdWUuZ2V0TGVuZ3RoKCkgLSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgcHJvcG9zYWwubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIG51bGwsIG51bGwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0RlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYzliZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IGZyb20gdGhlIGRlZmF1bHRzIGZvdW5kIGluIHRoZSBnaXZlbiB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0uCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotCi0gICAgcHVibGljIERlZmF1bHRzQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBsaXN0IG9mIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHVzaW5nIHRoZSBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYW5kIGRlZmF1bHQgdmFsdWVzIGluCi0gICAgICogdGhlIGdpdmVuIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufS4KLSAgICAgKiAgQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyI2dldE1lbWJlclZhbHVlUGFpcnMob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNULCBqYXZhLmxhbmcuQ2xhc3MpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGdldE1lbWJlclZhbHVlUGFpcnMoYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMgPSBhbm5vdGF0aW9uQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGRlY2xhcmVkTWV0aG9kcykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICBPYmplY3QgZGVmYXVsdFZhbHVlID0gbWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpOwotCi0gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkZWZhdWx0VmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBCb29sZWFuLnBhcnNlQm9vbGVhbihkZWZhdWx0VmFsdWUudG9TdHJpbmcoKSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpICYmIChyZXR1cm5UeXBlLmVxdWFscyhCeXRlLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKFNob3J0LlRZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlLmVxdWFscyhJbnRlZ2VyLlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKExvbmcuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEZsb2F0LlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKERvdWJsZS5UWVBFKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU51bWJlck1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIGRlZmF1bHRWYWx1ZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVBcnJheU1lbWJlclZhbHVlUGFpcihhc3QsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0W10pZGVmYXVsdFZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSwgbmFtZSwgZGVmYXVsdFZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlVHlwZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXJzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0lBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkODFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgaW5pdGlhbGl6ZXJzIGNvbnRyaWJ1dGVkIHRvIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkluaXRpYWxpemVyPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2Yge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gdGhhdCBtYXkgYmUgYWRkZWQgdG8gYSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbn0uCi0JICogQHBhcmFtIGphdmFFbGVtZW50IHRoZSBqYXZhIGVsZW1lbnQgb24gd2hpY2ggdGhlIGFubm90YXRpb24gaXMgZGVjbGFyZWQuCi0JICogQHBhcmFtIGFzdCB0aGUgPGNvZGU+QVNUPC9jb2RlPiB3aXRoIHdoaWNoIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXJzLgotCSAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MgdGhlIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcyB3aGljaCBtYXkgYmUKLQkgKiB1c2VkIHRvIHF1ZXJ5IHRoZSBkZWNsYXJlZCBtZW1iZXJzIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgYW5kIHRoZSBtZW1iZXJzIGRlZmF1bHQgdmFsdWVzLgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1lbWJlciB2YWx1ZSBwYWlycy4KLQkgKi8KLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIHtAbGluayBJQ29tcGxldGlvblByb3Bvc2FsfSBmb3IgYSB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB2YWx1ZS4KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGphdmEgZWxlbWVudCBvbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBkZWNsYXJlZC4KLSAgICAgKiBAcGFyYW0gbWVtYmVyVmFsdWVQYWlyIHRoZSBtZW1iZXIgdmFsdWUgcGFpciBpbiB3aGljaCBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZC4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBjb21wbGV0aW9uIHByb3Bvc2Fscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBwcm92aWRlIGEgbGlzdCBvZiB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbH0gZm9yIGEge0BsaW5rIFNpbmdsZU1lbWJlckFubm90YXRpb259IHZhbHVlLgotCSAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgamF2YSBlbGVtZW50IG9uIHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIGRlY2xhcmVkLgotICAgICAqIEBwYXJhbSBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uIHRoZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gaW4gd2hpY2ggY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQuCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb24oSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uKTsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMzg4ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkVjbGlwc2VNZXNzYWdlcjsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnV0aWwuU291cmNlUG9zaXRpb247Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcHJvY2Vzc29ycyBjb250cmlidXRlZCB0byB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3I8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciBpbXBsZW1lbnRzIEFubm90YXRpb25Qcm9jZXNzb3IgewotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHtAbGluayBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnR9IGVudmlyb25tZW50IHRvIHVzZSBkdXJpbmcgcHJvY2Vzc2luZy4KLSAgICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgdGhlIGFubm90YXRpb24gcHJvY2Vzc29yIGVudmlyb25tZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudChBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLSAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYWxsIHByb2dyYW0gZWxlbWVudHMgc3VwcG9ydGVkIGJ5IHRoaXMgYW5ub3RhdGlvbiBwcm9jZXNzb3IuCi0gICAgICogQHNlZSBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvcgotICAgICAqLwotICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzKCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEVycm9yKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uICwKLSAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgaWYgKG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludEVycm9yKG1pcnJvci5nZXRQb3NpdGlvbigpLCBlcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRFcnJvcihTb3VyY2VQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludEVycm9yKHBvc2l0aW9uLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnRFcnJvcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFdhcm5pbmcoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnRXYXJuaW5nKHBvc2l0aW9uLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludFdhcm5pbmcobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnROb3RpY2UoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnROb3RpY2UocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Tm90aWNlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnROb3RpY2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlRXJyb3IoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZUVycm9yKHBvc2l0aW9uLCBtZXNzYWdlLCAiIiwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlRXJyb3IoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBlcnJvcklkKSB7Ci0gICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZUVycm9yKHBvc2l0aW9uLCBtZXNzYWdlLCBwbHVnaW5JZCwgZXJyb3JJZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGVycm9ySWQpIHsKLSAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgbWVzc2FnZXIucHJpbnRGaXhhYmxlRXJyb3IobWVzc2FnZSwgcGx1Z2luSWQsIGVycm9ySWQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Rml4YWJsZVdhcm5pbmcoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsCi0gICAgICAgICAgICBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICBtZXNzYWdlci5wcmludEZpeGFibGVXYXJuaW5nKHBvc2l0aW9uLCBtZXNzYWdlLCBwbHVnaW5JZCwgZXJyb3JJZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICBtZXNzYWdlci5wcmludEZpeGFibGVXYXJuaW5nKG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Rml4YWJsZU5vdGljZShTb3VyY2VQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGVycm9ySWQpIHsKLSAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgbWVzc2FnZXIucHJpbnRGaXhhYmxlTm90aWNlKHBvc2l0aW9uLCBtZXNzYWdlLCBwbHVnaW5JZCwgZXJyb3JJZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlTm90aWNlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBlcnJvcklkKSB7Ci0gICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZU5vdGljZShtZXNzYWdlLCBwbHVnaW5JZCwgZXJyb3JJZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS91dGlscy9Bbm5vdGF0aW9uVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODEwMzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQywgU2hhbmUgQ2xhcmtlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgU2hhbmUgQ2xhcmtlIC0gUmV3cm90ZSBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuSW1wb3J0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5MaXN0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuQ29kZVN0eWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU2hhcmVkQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFkZGluZywgcmVtb3ZpbmcgYW5kIHVwZGF0aW5nIGFubm90YXRpb25zIGFuZCBtZW1iZXIgdmFsdWUgcGFpcnMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQW5ub3RhdGlvblV0aWxzIHsKLQotICAgIHByaXZhdGUgQW5ub3RhdGlvblV0aWxzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gaW1wb3J0IHRvIHRoZSBjb21waWxhdGlvbiB1bml0IG9mIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFFbGVtZW50fS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGphdmEgZWxlbWVudCB3aGljaCBpcyB1c2VkIHRvIGdldCB0aGUgY29tcGlsYXRpb24gdW5pdCB0byBhZGQgdGhlIGltcG9ydCB0by4KLSAgICAgKiBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudHMgYXJlIHN1cHBvcnRlZDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5UWVBFPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkZJRUxEPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50Lk1FVEhPRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRTwvbGk+Ci0gICAgICogQHBhcmFtIHF1YWxpZmllZE5hbWUgdGhlIGltcG9ydCB0byBhZGQuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbXBvcnQgcmV3cml0ZSBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkSW1wb3J0KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgY2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJBZGQgSW1wb3J0IiwgKElGaWxlKSBqYXZhRWxlbWVudC5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoamF2YUVsZW1lbnQsIHF1YWxpZmllZE5hbWUpOwotICAgICAgICBjaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uRWRpdCk7Ci0gICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBpbXBvcnQgZnJvbSB0aGUgY29tcGlsYXRpb24gdW5pdCBvZiB0aGUgZ2l2ZW4ge0BsaW5rIElKYXZhRWxlbWVudH0uIFRoZSBpbXBvcnQgd2lsbCBub3QgYmUgcmVtb3ZlZCBpZiB0aGUKLSAgICAgKiBpbXBvcnQgdHlwZSBpcyByZWZlcmVuY2VkIG9uIG1vcmUgdGhhbiBvbmUgYW5ub3RhdGFibGUgZWxlbWVudCBpbiB0aGUgc291cmNlIGNvZGUuIFRoaXMgbWV0aG9kCi0gICAgICogaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayBBbm5vdGF0aW9uVXRpbHMjcmVtb3ZlQW5ub3RhdGlvbihJSmF2YUVsZW1lbnQsIEFubm90YXRpb24pfX0uCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IHRoZSBqYXZhIGVsZW1lbnQgd2hpY2ggaXMgdXNlZCB0byBnZXQgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdG8gcmVtb3ZlIHRoZSBpbXBvcnQgZnJvbS4KLSAgICAgKiBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudHMgYXJlIHN1cHBvcnRlZDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5UWVBFPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkZJRUxEPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50Lk1FVEhPRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRTwvbGk+Ci0gICAgICogQHBhcmFtIHF1YWxpZmllZE5hbWUgdGhlIGltcG9ydCB0byByZW1vdmUuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbXBvcnQgcmV3cml0ZSBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlSW1wb3J0KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgY2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJSZW1vdmUgSW1wb3J0IiwgKElGaWxlKSBqYXZhRWxlbWVudC5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQoamF2YUVsZW1lbnQsIHF1YWxpZmllZE5hbWUpOwotICAgICAgICBjaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uRWRpdCk7Ci0gICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4ge0BsaW5rIEFubm90YXRpb259IHRvIHRoZSB7QGxpbmsgSUphdmFFbGVtZW50fS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnRzIGFyZSBzdXBwb3J0ZWQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgYW5ub3RhdGlvbiB0byBhZGQuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotICAgICAqIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEFubm90YXRpb24oSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFkZCBhbm5vdGF0aW9uIiwgKElGaWxlKSBqYXZhRWxlbWVudC5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KGphdmFFbGVtZW50LCBhbm5vdGF0aW9uKTsKLSAgICAgICAgY2hhbmdlLmFkZEVkaXQoYW5ub3RhdGlvbkVkaXQpOwotICAgICAgICBhcHBseUNoYW5nZShudWxsLCBjaGFuZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIHtAbGluayBBbm5vdGF0aW9ufSBmcm9tIHRoZSB7QGxpbmsgSUphdmFFbGVtZW50fS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnRzIGFyZSBzdXBwb3J0ZWQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgYW5ub3RhdGlvbiB0byByZW1vdmUuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotICAgICAqIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIlJlbW92ZSBhbm5vdGF0aW9uIiwgKElGaWxlKSBqYXZhRWxlbWVudC5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgVGV4dEVkaXQgdGV4dEVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KGphdmFFbGVtZW50LCBhbm5vdGF0aW9uKTsKLSAgICAgICAgY2hhbmdlLmFkZEVkaXQodGV4dEVkaXQpOwotICAgICAgICBhcHBseUNoYW5nZShudWxsLCBjaGFuZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHRvIHRoZSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbn0uCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIG5vcm1hbCBhbm5vdGF0aW9uIHRvIGFkZCB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8uCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpciB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gYWRkLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMKLSAgICAgKiBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFubm90YXRpb24uZ2V0Um9vdCgpIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgYW5ub3RhdGlvbi5nZXRSb290KCk7Ci0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFkZCBNZW1iZXIgVmFsdWUgUGFpciIsIChJRmlsZSkgY29tcGlsYXRpb25Vbml0LmdldEphdmFFbGVtZW50KCkuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgICAgIFRleHRFZGl0IGFubm90YXRpb25FZGl0ID0gQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZE1lbWJlclZhbHVlUGFpclRleHRFZGl0KGFubm90YXRpb24sIG1lbWJlclZhbHVlUGFpcik7Ci0gICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uRWRpdCk7Ci0gICAgICAgICAgICBhcHBseUNoYW5nZShudWxsLCBjaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gZnJvbSB0aGUge0BsaW5rIE5vcm1hbEFubm90YXRpb259LgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBub3JtYWwgYW5ub3RhdGlvbiBmcm9tIHdoaWNoIHRvIHJlbW92ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpciB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gcmVtb3ZlLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMKLSAgICAgKiBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFubm90YXRpb24uZ2V0Um9vdCgpIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgYW5ub3RhdGlvbi5nZXRSb290KCk7Ci0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIlJlbW92ZSBNZW1iZXIgVmFsdWUgUGFpciIsIChJRmlsZSkgY29tcGlsYXRpb25Vbml0LmdldEphdmFFbGVtZW50KCkuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgICAgIFRleHRFZGl0IGFubm90YXRpb25FZGl0ID0gQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KGFubm90YXRpb24sIG1lbWJlclZhbHVlUGFpcik7Ci0gICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uRWRpdCk7Ci0gICAgICAgICAgICBhcHBseUNoYW5nZShudWxsLCBjaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gdmFsdWUgd2l0aCB0aGUgZ2l2ZW4ge0BsaW5rIEFTVE5vZGV9LgotICAgICAqIEBwYXJhbSBtZW1iZXJWYWx1ZVBhaXIgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHVwZGF0ZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0gICAgICogYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlTWVtYmVyVmFsdWVQYWlyKE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIsIEFTVE5vZGUgdmFsdWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldFJvb3QoKSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIG1lbWJlclZhbHVlUGFpci5nZXRSb290KCk7Ci0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIlVwZGF0ZSBNZW1iZXIgVmFsdWUgUGFpciIsIChJRmlsZSkgY29tcGlsYXRpb25Vbml0LmdldEphdmFFbGVtZW50KCkuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgICAgIFRleHRFZGl0IGFubm90YXRpb25FZGl0ID0gQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVVwZGF0ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KG1lbWJlclZhbHVlUGFpciwgdmFsdWUpOwotICAgICAgICAgICAgY2hhbmdlLmFkZEVkaXQoYW5ub3RhdGlvbkVkaXQpOwotICAgICAgICAgICAgYXBwbHlDaGFuZ2UobnVsbCwgY2hhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSB7QGxpbmsgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbn0gd2l0aCB0aGUgZ2l2ZW4ge0BsaW5rIEFTVE5vZGV9LgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gdG8gdXBkYXRlLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0LgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMKLSAgICAgKiBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwgQVNUTm9kZSB2YWx1ZSkgIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoYW5ub3RhdGlvbi5nZXRSb290KCkgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBhbm5vdGF0aW9uLmdldFJvb3QoKTsKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiVXBkYXRlIFNpbmdsZSBNZW1iZXIgQW5ub3RhdGlvbiIsIChJRmlsZSkgY29tcGlsYXRpb25Vbml0LmdldEphdmFFbGVtZW50KCkuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgICAgIFRleHRFZGl0IGFubm90YXRpb25FZGl0ID0gQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXh0RWRpdChhbm5vdGF0aW9uLCB2YWx1ZSk7Ci0gICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uRWRpdCk7Ci0gICAgICAgICAgICBhcHBseUNoYW5nZShudWxsLCBjaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYWRkIGltcG9ydCBjaGFuZ2UgdG8gdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBqYXZhIGVsZW1lbnRzIGNvbXBpbGF0aW9uIHVuaXQuCi0gICAgICogVGhlIGNvbXBpbGF0aW9uIHVuaXQgaXRzZWxmIGlzIG5vdCBtb2RpZmllZC4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50OgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgamF2YSBlbGVtZW50IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB3aGljaCB3aWxsIGluIHR1cm4gYmUgdXNlZCB0byBjcmVhdGUgYW4ge0BsaW5rIEltcG9ydFJld3JpdGV9LgotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSB0aGUgaW1wb3J0IHRvIGFkZC4KLSAgICAgKiBAcmV0dXJuIHRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgYWRkIGltcG9ydCBjaGFuZ2VzLgotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aGUgZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgaW1wb3J0IHJld3JpdGUgZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXh0RWRpdCBjcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIFN0cmluZyBxdWFsaWZpZWROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1QoZ2V0Q29tcGlsYXRpb25Vbml0RnJvbUphdmFFbGVtZW50KGphdmFFbGVtZW50KSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotICAgICAgICBJbXBvcnRSZXdyaXRlIGltcG9ydFJld3JpdGUgPSBDb2RlU3R5bGVDb25maWd1cmF0aW9uLmNyZWF0ZUltcG9ydFJld3JpdGUoY29tcGlsYXRpb25Vbml0LCB0cnVlKTsKLSAgICAgICAgaW1wb3J0UmV3cml0ZS5hZGRJbXBvcnQocXVhbGlmaWVkTmFtZSk7Ci0gICAgICAgIHJldHVybiBpbXBvcnRSZXdyaXRlLnJld3JpdGVJbXBvcnRzKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVGV4dEVkaXR9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlbW92ZSBpbXBvcnQgY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LgotICAgICAqIFRoZSBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuIE5vIGNoYW5nZSB3aWxsIGJlIHJlY29yZGVkIGlmIHRoZSBpbXBvcnQgdHlwZSBpcyByZWZlcmVuY2VkIG9uIG1vcmUgdGhhbiBvbmUgYW4gYW5ub3RhdGFibGUKLSAgICAgKiBlbGVtZW50IGluIHRoZSBzb3VyY2UgY29kZS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayBBbm5vdGF0aW9uVXRpbHMjY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KElKYXZhRWxlbWVudCwgQW5ub3RhdGlvbil9fS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50OgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgamF2YSBlbGVtZW50IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSB7QGxpbmsgQ29tcGlsYXRpb25Vbml0fSB3aGljaCB3aWxsIGluIHR1cm4gYmUgdXNlZCB0byBjcmVhdGUgYW4ge0BsaW5rIEltcG9ydFJld3JpdGV9LgotICAgICAqIDwvcD4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSB0aGUgYW5ub3RhdGlvbiBpbXBvcnQgdG8gcmVtb3ZlLgotICAgICAqIEByZXR1cm4gdGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSByZW1vdmUgaW1wb3J0IGNoYW5nZXMuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbXBvcnQgcmV3cml0ZSBmYWlscy4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChnZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQoamF2YUVsZW1lbnQpLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIEltcG9ydFJld3JpdGUgaW1wb3J0UmV3cml0ZSA9IENvZGVTdHlsZUNvbmZpZ3VyYXRpb24uY3JlYXRlSW1wb3J0UmV3cml0ZShjb21waWxhdGlvblVuaXQsIHRydWUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblNpbXBsZU5hbWUgPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhxdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG9jY3VyZW5jZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgTGlzdDxFbGVtZW50VHlwZT4gZWxlbWVudFR5cGVzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbGVtZW50VHlwZXMgPSBhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRUYXJnZXRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA6IGVsZW1lbnRUeXBlcykgewotICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlLlBBQ0tBR0UpIHsKLSAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRBbm5vdGF0aW9uT2NjdXJyZW5jZXMocGFja2FnZURlY2xhcmF0aW9uLmFubm90YXRpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lLCBvY2N1cmVuY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlLlRZUEUpIHsKLSAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRBbm5vdGF0aW9uT2NjdXJyZW5jZXModHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uU2ltcGxlTmFtZSwgb2NjdXJlbmNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZS5GSUVMRCkgewotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hY2NlcHQobmV3IEFTVFZpc2l0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QW5ub3RhdGlvbk9jY3VycmVuY2VzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZERlY2xhcmF0aW9uLm1vZGlmaWVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uU2ltcGxlTmFtZSwgb2NjdXJlbmNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZS5NRVRIT0QpIHsKLSAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QW5ub3RhdGlvbk9jY3VycmVuY2VzKG1ldGhvZERlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tb2RpZmllcnMoKSwgYW5ub3RhdGlvblNpbXBsZU5hbWUsIG9jY3VyZW5jZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gRWxlbWVudFR5cGUuUEFSQU1FVEVSKSB7Ci0gICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmFjY2VwdChuZXcgQVNUVmlzaXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRBbm5vdGF0aW9uT2NjdXJyZW5jZXMoc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubW9kaWZpZXJzKCksIGFubm90YXRpb25TaW1wbGVOYW1lLCBvY2N1cmVuY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChvY2N1cmVuY2VzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICBpbXBvcnRSZXdyaXRlLnJlbW92ZUltcG9ydChxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPIENsZWFudXAgaW1wb3J0cy4gUmVwZWF0ZWRseSBhZGRpbmcgYW5kIHJlbW92aW5nIGFuIGltcG9ydAotICAgICAgICAvLyB3aGVyZSBub25lIGV4aXN0ZWQgYmVmb3JlIHdpbGwKLSAgICAgICAgLy8gaW5zZXJ0IGEgbmV3IGxpbmUgb24gZWFjaCBpbnNlcnQuCi0gICAgICAgIHJldHVybiBpbXBvcnRSZXdyaXRlLnJld3JpdGVJbXBvcnRzKG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY291bnRBbm5vdGF0aW9uT2NjdXJyZW5jZXMoTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzLCBTdHJpbmcgYW5ub3RhdGlvblNpbXBsZU5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gb2NjdXJlbmNlcykgewotICAgICAgICBmb3IgKElFeHRlbmRlZE1vZGlmaWVyIGV4dGVuZGVkTW9kaWZpZXIgOiBtb2RpZmllcnMpIHsKLSAgICAgICAgICAgIGlmIChleHRlbmRlZE1vZGlmaWVyIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgIEFubm90YXRpb24gZXhpc3RpbmdBbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGV4dGVuZGVkTW9kaWZpZXI7Ci0gICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShleGlzdGluZ0Fubm90YXRpb24pLmVxdWFscyhhbm5vdGF0aW9uU2ltcGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgb2NjdXJlbmNlcy5hZGQoYW5ub3RhdGlvblNpbXBsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVGV4dEVkaXR9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGFkZCBhbm5vdGF0aW9uIGNoYW5nZSB0byB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGphdmEgZWxlbWVudHMgY29tcGlsYXRpb24gdW5pdC4KLSAgICAgKiBUaGUgY29tcGlsYXRpb24gdW5pdCBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgYW5ub3RhdGlvbiB0byBhZGQuCi0gICAgICogQHJldHVybiB0ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGFkZCBhbm5vdGF0aW9uIGNoYW5nZXMuIFJldHVybnMgYSB7QGxpbmsgTXVsdGlUZXh0RWRpdH0gaWYgdGhlIGdpdmVuIGphdmEgZWxlbWVudCBpc24ndCBzdXBwb3J0ZWQuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotICAgICAqIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXh0RWRpdCBjcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBzd2l0Y2goamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdCgoSVBhY2thZ2VEZWNsYXJhdGlvbikgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5UWVBFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdCgoSVR5cGUpIGphdmFFbGVtZW50LCBhbm5vdGF0aW9uKTsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KChJRmllbGQpIGphdmFFbGVtZW50LCBhbm5vdGF0aW9uKTsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdCgoSU1ldGhvZCkgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRToKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoKElMb2NhbFZhcmlhYmxlKSBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVGV4dEVkaXR9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlbW92ZSBhbm5vdGF0aW9uIGNoYW5nZSB0byB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGphdmEgZWxlbWVudHMgY29tcGlsYXRpb24gdW5pdC4KLSAgICAgKiBUaGUgY29tcGlsYXRpb24gdW5pdCBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgYW5ub3RhdGlvbiB0byBhZGQuCi0gICAgICogQHJldHVybiB0ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGFkZCBhbm5vdGF0aW9uIGNoYW5nZXMuIFJldHVybnMgYSB7QGxpbmsgTXVsdGlUZXh0RWRpdH0gaWYgdGhlIGdpdmVuIGphdmEgZWxlbWVudCBpc24ndCBzdXBwb3J0ZWQuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotICAgICAqIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXh0RWRpdCBjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBzd2l0Y2goamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdCgoSVBhY2thZ2VEZWNsYXJhdGlvbikgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5UWVBFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdCgoSVR5cGUpIGphdmFFbGVtZW50LCBhbm5vdGF0aW9uKTsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KChJRmllbGQpIGphdmFFbGVtZW50LCBhbm5vdGF0aW9uKTsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdCgoSU1ldGhvZCkgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRToKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoKElMb2NhbFZhcmlhYmxlKSBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwbHlDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vbml0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJVW5kb01hbmFnZXIgbWFuYWdlciA9IFJlZmFjdG9yaW5nQ29yZS5nZXRVbmRvTWFuYWdlcigpOwotICAgICAgICBib29sZWFuIHN1Y2Nlc3NmdWwgPSBmYWxzZTsKLSAgICAgICAgQ2hhbmdlIHVuZG9DaGFuZ2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2hhbmdlLmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShtb25pdG9yKTsKLSAgICAgICAgICAgIFJlZmFjdG9yaW5nU3RhdHVzIHZhbGlkID0gY2hhbmdlLmlzVmFsaWQobW9uaXRvcik7Ci0gICAgICAgICAgICBpZiAodmFsaWQuaXNPSygpKSB7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5hYm91dFRvUGVyZm9ybUNoYW5nZShjaGFuZ2UpOwotICAgICAgICAgICAgICAgIHVuZG9DaGFuZ2UgPSBjaGFuZ2UucGVyZm9ybShtb25pdG9yKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtYW5hZ2VyLmNoYW5nZVBlcmZvcm1lZChjaGFuZ2UsIHN1Y2Nlc3NmdWwpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bmRvQ2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVuZG9DaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgbWFuYWdlci5hZGRVbmRvKHVuZG9DaGFuZ2UuZ2V0TmFtZSgpLCB1bmRvQ2hhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhY2thZ2VEZWNsYXJhdGlvbiAhPSBudWxsICYmICFpc0Fubm90YXRpb25QcmVzZW50KHBhY2thZ2VEZWNsYXJhdGlvbiwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSkgewotICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQocGFja2FnZURlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoY29tcGlsYXRpb25Vbml0LmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShjb21waWxhdGlvblVuaXQuZ2V0UGFja2FnZSgpLCBQYWNrYWdlRGVjbGFyYXRpb24uQU5OT1RBVElPTlNfUFJPUEVSVFkpOwotCi0gICAgICAgICAgICBsaXN0UmV3cml0ZS5pbnNlcnRGaXJzdChhbm5vdGF0aW9uLCBudWxsKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJld3JpdGVyLnJld3JpdGVBU1QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUZXh0RWRpdCBjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoSVBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwYWNrYWdlRGVjbGFyYXRpb24gIT0gbnVsbCAmJiBpc0Fubm90YXRpb25QcmVzZW50KHBhY2thZ2VEZWNsYXJhdGlvbiwgZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKSB7Ci0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChwYWNrYWdlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShjb21waWxhdGlvblVuaXQuZ2V0QVNUKCkpOwotCi0gICAgICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24gcGtnRGVjbGFyYXRpb24gPSBjb21waWxhdGlvblVuaXQuZ2V0UGFja2FnZSgpOwotCi0gICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKHBrZ0RlY2xhcmF0aW9uLCBQYWNrYWdlRGVjbGFyYXRpb24uQU5OT1RBVElPTlNfUFJPUEVSVFkpOwotCi0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIExpc3Qgb3JpZ2luYWxMaXN0ID0gbGlzdFJld3JpdGUuZ2V0T3JpZ2luYWxMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBvcmlnaW5hbExpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJiBjb21wYXJlQW5ub3RhdGlvbk5hbWVzKChBbm5vdGF0aW9uKSBvYmplY3QsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RSZXdyaXRlLnJlbW92ZSgoQW5ub3RhdGlvbikgb2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChJVHlwZSB0eXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBnZXRUeXBlRGVjbGFyYXRpb24odHlwZSk7Ci0gICAgICAgIGlmKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsICYmICFpc0Fubm90YXRpb25QcmVzZW50KHR5cGUsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUodHlwZURlY2xhcmF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZSh0eXBlRGVjbGFyYXRpb24sIGdldENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvckZvclR5cGUodHlwZURlY2xhcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEZpcnN0KGFubm90YXRpb24sIG51bGwpOwotCi0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChJVHlwZSB0eXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBnZXRUeXBlRGVjbGFyYXRpb24odHlwZSk7Ci0gICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCAmJiBpc0Fubm90YXRpb25QcmVzZW50KHR5cGUsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUodHlwZURlY2xhcmF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZSh0eXBlRGVjbGFyYXRpb24sIGdldENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvckZvclR5cGUodHlwZURlY2xhcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgTGlzdCBvcmlnaW5hbExpc3QgPSBsaXN0UmV3cml0ZS5nZXRPcmlnaW5hbExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IG9yaWdpbmFsTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBbm5vdGF0aW9uICYmIGNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoKEFubm90YXRpb24pb2JqZWN0LCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0UmV3cml0ZS5yZW1vdmUoKEFubm90YXRpb24pb2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChJTWV0aG9kIG1ldGhvZCwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBnZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QpOwotICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24gIT0gbnVsbCAmJiAhaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUobWV0aG9kRGVjbGFyYXRpb24uZ2V0QVNUKCkpOwotCi0gICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKG1ldGhvZERlY2xhcmF0aW9uLCAgTWV0aG9kRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEF0KGFubm90YXRpb24sIDAsIG51bGwpOwotCi0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChJTWV0aG9kIG1ldGhvZCwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBnZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QpOwotICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24gIT0gbnVsbCAmJiBpc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShtZXRob2REZWNsYXJhdGlvbi5nZXRBU1QoKSk7Ci0KLSAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUobWV0aG9kRGVjbGFyYXRpb24sICBNZXRob2REZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLQotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBMaXN0IG9yaWdpbmFsTGlzdCA9IGxpc3RSZXdyaXRlLmdldE9yaWdpbmFsTGlzdCgpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFubm90YXRpb24gJiYgY29tcGFyZUFubm90YXRpb25OYW1lcygoQW5ub3RhdGlvbikgb2JqZWN0LCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0UmV3cml0ZS5yZW1vdmUoKEFubm90YXRpb24pIG9iamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJld3JpdGVyLnJld3JpdGVBU1QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUZXh0RWRpdCBjcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoSUZpZWxkIGZpZWxkLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBnZXRGaWVsZERlY2xhcmF0aW9uKGZpZWxkKTsKLSAgICAgICAgaWYgKGZpZWxkRGVjbGFyYXRpb24gIT0gbnVsbCAmJiAhaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZCwgYW5ub3RhdGlvbikpIHsKLQotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGZpZWxkRGVjbGFyYXRpb24uZ2V0QVNUKCkpOwotCi0gICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKGZpZWxkRGVjbGFyYXRpb24sIEZpZWxkRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSk7Ci0gICAgICAgICAgICBsaXN0UmV3cml0ZS5pbnNlcnRBdChhbm5vdGF0aW9uLCAwLCBudWxsKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJld3JpdGVyLnJld3JpdGVBU1QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChJRmllbGQgZmllbGQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IGdldEZpZWxkRGVjbGFyYXRpb24oZmllbGQpOwotICAgICAgICBpZiAoZmllbGREZWNsYXJhdGlvbiAhPSBudWxsICYmIGlzQW5ub3RhdGlvblByZXNlbnQoZmllbGQsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoZmllbGREZWNsYXJhdGlvbi5nZXRBU1QoKSk7Ci0KLSAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoZmllbGREZWNsYXJhdGlvbiwgRmllbGREZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLQotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBMaXN0IG9yaWdpbmFsTGlzdCA9IGxpc3RSZXdyaXRlLmdldE9yaWdpbmFsTGlzdCgpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFubm90YXRpb24gJiYgY29tcGFyZUFubm90YXRpb25OYW1lcygoQW5ub3RhdGlvbikgb2JqZWN0LCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0UmV3cml0ZS5yZW1vdmUoKEFubm90YXRpb24pIG9iamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJld3JpdGVyLnJld3JpdGVBU1QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUZXh0RWRpdCBjcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoSUxvY2FsVmFyaWFibGUgbWV0aG9kUGFyYW1ldGVyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IGdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24obWV0aG9kUGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlciAhPSBudWxsICYmICFpc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZFBhcmFtZXRlciwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSkgewotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKHBhcmFtZXRlci5nZXRBU1QoKSk7Ci0KLSAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUocGFyYW1ldGVyLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFkpOwotCi0gICAgICAgICAgICBsaXN0UmV3cml0ZS5pbnNlcnRBdChhbm5vdGF0aW9uLCAtMSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KElMb2NhbFZhcmlhYmxlIG1ldGhvZFBhcmFtZXRlciwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgPSBnZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKG1ldGhvZFBhcmFtZXRlcik7Ci0gICAgICAgIGlmIChpc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZFBhcmFtZXRlciwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSkgewotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKHBhcmFtZXRlci5nZXRBU1QoKSk7Ci0KLSAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUocGFyYW1ldGVyLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFkpOwotCi0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIExpc3Qgb3JpZ2luYWxMaXN0ID0gbGlzdFJld3JpdGUuZ2V0T3JpZ2luYWxMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBvcmlnaW5hbExpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJiBjb21wYXJlQW5ub3RhdGlvbk5hbWVzKChBbm5vdGF0aW9uKW9iamVjdCwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKChBbm5vdGF0aW9uKW9iamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVGV4dEVkaXR9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNoYW5nZSBvZiBhZGRpbmcgdGhlIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHRvIHRoZSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbn0uCi0gICAgICogVGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdCBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBub3JtYWwgYW5ub3RhdGlvbiB0byBhZGQgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIHRvLgotICAgICAqIEBwYXJhbSBtZW1iZXJWYWx1ZVBhaXIgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIHRvIGFkZC4KLSAgICAgKiBAcmV0dXJuIHRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgYWRkIG1lbWJlciB2YWx1ZSBwYWlyIGNoYW5nZS4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMgYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZE1lbWJlclZhbHVlUGFpclRleHRFZGl0KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhbm5vdGF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKGFubm90YXRpb24sIE5vcm1hbEFubm90YXRpb24uVkFMVUVTX1BST1BFUlRZKTsKLQotICAgICAgICBsaXN0UmV3cml0ZS5pbnNlcnRMYXN0KG1lbWJlclZhbHVlUGFpciwgbnVsbCk7Ci0KLSAgICAgICAgcmV0dXJuIHJld3JpdGVyLnJld3JpdGVBU1QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRleHRFZGl0fSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjaGFuZ2Ugb2YgcmVtb3ZpbmcgdGhlIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IGZyb20gdGhlIHtAbGluayBOb3JtYWxBbm5vdGF0aW9ufS4KLSAgICAgKiBUaGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIG5vcm1hbCBhbm5vdGF0aW9uIHRvIHJlbW92ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgZnJvbS4KLSAgICAgKiBAcGFyYW0gbWVtYmVyVmFsdWVQYWlyIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0byByZW1vdmUuCi0gICAgICogQHJldHVybiB0ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHJlbW92ZSBtZW1iZXIgdmFsdWUgcGFpciBjaGFuZ2UuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbgotICAgICAqIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXh0RWRpdCBjcmVhdGVSZW1vdmVNZW1iZXJWYWx1ZVBhaXJUZXh0RWRpdChOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYW5ub3RhdGlvbi5nZXRBU1QoKSk7Ci0KLSAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShhbm5vdGF0aW9uLCBOb3JtYWxBbm5vdGF0aW9uLlZBTFVFU19QUk9QRVJUWSk7Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIExpc3Qgb3JpZ2luYWxMaXN0ID0gbGlzdFJld3JpdGUuZ2V0T3JpZ2luYWxMaXN0KCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IG9yaWdpbmFsTGlzdCkgewotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1lbWJlclZhbHVlUGFpcikgewotICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtdnAgPSAoTWVtYmVyVmFsdWVQYWlyKSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgaWYgKG12cC5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKG12cCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY2hhbmdlIG9mIHVwZGF0aW5nIHRoZSB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIHRoZSB7QGxpbmsgQVNUTm9kZX0gdmFsdWUuCi0gICAgICogVGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdCBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLgotICAgICAqIEBwYXJhbSBtZW1iZXJWYWx1ZVBhaXIgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHVwZGF0ZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldC4KLSAgICAgKiBAcmV0dXJuIHRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgdXBkYXRlIG1lbWJlciB2YWx1ZSBwYWlyIGNoYW5nZS4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMgYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVVwZGF0ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIsIEFTVE5vZGUgdmFsdWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUobWVtYmVyVmFsdWVQYWlyLmdldEFTVCgpKTsKLQotICAgICAgICByZXdyaXRlci5zZXQobWVtYmVyVmFsdWVQYWlyLCBNZW1iZXJWYWx1ZVBhaXIuVkFMVUVfUFJPUEVSVFksIHZhbHVlLCBudWxsKTsKLQotICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVGV4dEVkaXR9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNoYW5nZSBvZiB1cGRhdGluZyB0aGUge0BsaW5rIFNpbmdsZU1lbWJlckFubm90YXRpb259IHdpdGggdGhlIHtAbGluayBBU1ROb2RlfSB2YWx1ZS4KLSAgICAgKiBUaGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIHNpbmdsZSBtZW1lYmVyIGFubm90YXRpb24gdG8gdXBkYXRlLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0LgotICAgICAqIEByZXR1cm4gdGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSB1cGRhdGUgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIGNoYW5nZS4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMgYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXh0RWRpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIEFTVE5vZGUgdmFsdWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYW5ub3RhdGlvbi5nZXRBU1QoKSk7Ci0KLSAgICAgICAgcmV3cml0ZXIuc2V0KGFubm90YXRpb24sIFNpbmdsZU1lbWJlckFubm90YXRpb24uVkFMVUVfUFJPUEVSVFksIHZhbHVlLCBudWxsKTsKLQotICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdH0gZm9yIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFFbGVtZW50fS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50OgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcmV0dXJuIGEgY29tcGlsYXRpb24gdW5pdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0RnJvbUphdmFFbGVtZW50KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgewotICAgICAgICBzd2l0Y2goamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUOgotICAgICAgICAgICAgcmV0dXJuIChJQ29tcGlsYXRpb25Vbml0KSBqYXZhRWxlbWVudDsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjoKLSAgICAgICAgICAgIElQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gKElQYWNrYWdlRGVjbGFyYXRpb24pIGphdmFFbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIChJQ29tcGlsYXRpb25Vbml0KSBwYWNrYWdlRGVjbGFyYXRpb24uZ2V0UGFyZW50KCk7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlRZUEU6Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIHJldHVybiB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LkZJRUxEOgotICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFOgotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgbG9jYWxWYXJpYWJsZSA9IChJTG9jYWxWYXJpYWJsZSkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBpZiAobG9jYWxWYXJpYWJsZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcGlsYXRpb25Vbml0RnJvbUphdmFFbGVtZW50KGxvY2FsVmFyaWFibGUuZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKSBqYXZhRWxlbWVudC5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbn0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4ge0BsaW5rIElUeXBlfS4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZS4KLSAgICAgKiBAcmV0dXJuIGEgdHlwZSBkZWNsYXJhdGlvbiBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihJVHlwZSB0eXBlKSB7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1QodHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotICAgICAgICBMaXN0PFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMgPSBjb21waWxhdGlvblVuaXQudHlwZXMoKTsKLSAgICAgICAgZm9yIChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiA6IHR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoY29tcGFyZVR5cGVOYW1lcyhhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwgdHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWJzdHJhY3RUeXBlRGVjbGFyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB7QGxpbmsgSU1ldGhvZH0uCi0gICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kCi0gICAgICogQHJldHVybiBhIG1ldGhvZCBkZWNsYXJhdGlvbiBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZERlY2xhcmF0aW9uIGdldE1ldGhvZERlY2xhcmF0aW9uKElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGdldFR5cGVEZWNsYXJhdGlvbihtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gYm9keURlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCk7Ci0gICAgICAgICAgICBmb3IgKEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gOiBib2R5RGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJvZHlEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJlTWV0aG9kcyhtZXRob2REZWNsYXJhdGlvbiwgbWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB7QGxpbmsgSUZpZWxkfS4KLSAgICAgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkCi0gICAgICogQHJldHVybiBhIGZpZWxkIGRlY2xhcmF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgRmllbGREZWNsYXJhdGlvbiBnZXRGaWVsZERlY2xhcmF0aW9uKElGaWVsZCBmaWVsZCkgewotICAgICAgICBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBnZXRUeXBlRGVjbGFyYXRpb24oZmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gYm9keURlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCk7Ci0gICAgICAgICAgICBmb3IgKEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gOiBib2R5RGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJvZHlEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVGaWVsZE5hbWVzKGZpZWxkRGVjbGFyYXRpb24sIGZpZWxkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkRGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb259IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHtAbGluayBJTG9jYWxWYXJpYWJsZX0uCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IHRoZSBsb2NhbCB2YXJpYWJsZQotICAgICAqIEByZXR1cm4gYSBzaW5nbGUgdmFyaWFibGUgZGVjbGFyYXRpb24gb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oSUxvY2FsVmFyaWFibGUgamF2YUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUxvY2FsVmFyaWFibGUgJiYgamF2YUVsZW1lbnQuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBsb2NhbFZhcmlhYmxlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBnZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QpOwotCi0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIGlmIChzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGxvY2FsVmFyaWFibGUuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBnZXRDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3JGb3JUeXBlKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uCi0gICAgICAgICAgICBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBDaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgY2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yID0gbnVsbDsKLSAgICAgICAgaWYgKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICBjaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgPSBUeXBlRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBFbnVtRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIGNoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciA9IEVudW1EZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIGNoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciA9IEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFubm90YXRpb25zIHR5cGUgbmFtZS4gSWYgdGhlIGFubm90YXRpb24gbmFtZSBpcyBhIHNpbXBsZSBuYW1lLCB0aGUgcmVzdWx0IGlzIHRoZQotICAgICAqIG5hbWUncyBpZGVudGlmaWVyLiBJZiB0aGUgbmFtZSBpcyBhIHF1YWxpZmllZCBuYW1lLCB0aGUgcmVzdWx0IGlzIHRoZSBuYW1lIG9mIHRoZSBxdWFsaWZpZXIKLSAgICAgKiBmb2xsb3dlZCBieSAiLiIgZm9sbG93ZWQgYnkgdGhlIG5hbWUncyBpZGVudGlmaWVyLgotCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIGFubm90YXRpb24uCi0gICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBuYW1lLiBUaGUgc2ltcGxlIG5hbWUgb3IgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBOYW1lIGFubm90YXRpb25UeXBlTmFtZSA9IGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKTsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25UeXBlTmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUge0BsaW5rIEFic3RyYWN0VHlwZURlY2xhcmF0aW9ufSBhbmQge0BsaW5rIElUeXBlfS4KLSAgICAgKiBAcGFyYW0gYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdGhlIHR5cGUgZGVjbGFyYXRpb24uCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbmFtZXMgbWF0Y2guCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVUeXBlTmFtZXMoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24sIElUeXBlIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKHR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gYW5kIHtAbGluayBJTWV0aG9kfS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kRGVjbGFyYXRpb24gdGhlIG1ldGhvZCBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIG5hbWVzIGFuZCBwYXJhbWV0ZXIgdHlwZXMgbWF0Y2guCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVNZXRob2RzKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXRUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvblBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBpZiAocGFyYW1ldGV0VHlwZXMubGVuZ3RoID09IG1ldGhvZERlY2xhcmF0aW9uUGFyYW1ldGVycy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRldFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaW1wbGVOYW1lMSA9IFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbWV0ZXRUeXBlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaW1wbGVOYW1lMiA9IG1ldGhvZERlY2xhcmF0aW9uUGFyYW1ldGVycy5nZXQoaSkuZ2V0VHlwZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2ltcGxlTmFtZTEuZXF1YWxzKHNpbXBsZU5hbWUyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgdHdvIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0uCi0gICAgICogQHBhcmFtIG1ldGhvZE9uZSB0aGUgZmlyc3QgbWV0aG9kIGRlY2xhcmF0aW9uLgotICAgICAqIEBwYXJhbSBtZXRob2RUd28gdGhlIHNlY29uZCBtZXRob2QgZGVjbGFyYXRpb24uCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIG5hbWVzIGFuZCBwYXJhbWV0ZXIgdHlwZXMgbWF0Y2guCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVNZXRob2RzKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZE9uZSwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVHdvKSB7Ci0gICAgICAgIGlmIChtZXRob2RPbmUuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobWV0aG9kVHdvLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkpKSB7Ci0gICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IG1ldGhvZFBhcmFtZXRlcnNPbmUgPSBtZXRob2RPbmUucGFyYW1ldGVycygpOwotICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBtZXRob2RQYXJhbWV0ZXJzVHdvID0gbWV0aG9kVHdvLnBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RQYXJhbWV0ZXJzT25lLnNpemUoKSA9PSBtZXRob2RQYXJhbWV0ZXJzVHdvLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kUGFyYW1ldGVyc09uZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2ltcGxlTmFtZTEgPSBtZXRob2RQYXJhbWV0ZXJzT25lLmdldChpKS5nZXRUeXBlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpbXBsZU5hbWUyID0gbWV0aG9kUGFyYW1ldGVyc1R3by5nZXQoaSkuZ2V0VHlwZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2ltcGxlTmFtZTEuZXF1YWxzKHNpbXBsZU5hbWUyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgdHdvIHtAbGluayBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbn0uCi0gICAgICogQHBhcmFtIG1ldGhvZE9uZSB0aGUgZmlyc3QgbWV0aG9kIGRlY2xhcmF0aW9uLgotICAgICAqIEBwYXJhbSBtZXRob2RUd28gdGhlIHNlY29uZCBtZXRob2QgZGVjbGFyYXRpb24uCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIG5hbWVzIGFuZCBwYXJhbWV0ZXIgdHlwZXMgbWF0Y2guCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVNZXRob2RzKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZE9uZSwKLSAgICAgICAgICAgIGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZFR3bykgewotICAgICAgICByZXR1cm4gY29tcGFyZU1ldGhvZE5hbWVzKG1ldGhvZE9uZSwgbWV0aG9kVHdvKSAmJiBjb21wYXJlTWV0aG9kUGFyYW1ldGVyVHlwZXMobWV0aG9kT25lLCBtZXRob2RUd28pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29tcGFyZU1ldGhvZE5hbWVzKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZE9uZSwKLSAgICAgICAgICAgIGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZFR3bykgewotICAgICAgICByZXR1cm4gbWV0aG9kT25lLmdldFNpbXBsZU5hbWUoKS5lcXVhbHMobWV0aG9kVHdvLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWV0aG9kUGFyYW1ldGVyVHlwZXMoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kT25lLAotICAgICAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVHdvKSB7Ci0gICAgICAgIGludCBudW1iZXJPZlBhcmFtZXRlcnNPbmUgPSBtZXRob2RPbmUuZ2V0UGFyYW1ldGVycygpLnNpemUoKTsKLSAgICAgICAgaW50IG51bWJlck9mUGFyYW1ldGVyc1R3byA9IG1ldGhvZFR3by5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpOwotCi0gICAgICAgIGlmIChudW1iZXJPZlBhcmFtZXRlcnNPbmUgPT0gbnVtYmVyT2ZQYXJhbWV0ZXJzVHdvKSB7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzT25lID0gKExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+KSBtZXRob2RPbmUuZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVyc1R3byA9IChMaXN0PFBhcmFtZXRlckRlY2xhcmF0aW9uPikgbWV0aG9kVHdvLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyc09uZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghcGFyYW1ldGVyc09uZS5nZXQoaSkuZ2V0VHlwZSgpLmVxdWFscyhwYXJhbWV0ZXJzVHdvLmdldChpKS5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHtAbGluayBGaWVsZERlY2xhcmF0aW9ufSBhbmQge0BsaW5rIElGaWVsZH0uCi0gICAgICogQHBhcmFtIGZpZWxkRGVjbGFyYXRpb24gdGhlIGZpZWxkIGRlY2xhcmF0aW9uLgotICAgICAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmllbGQgbmFtZXMgbWF0Y2guCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVGaWVsZE5hbWVzKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiwgSUZpZWxkIGZpZWxkKSB7Ci0gICAgICAgIExpc3Q8VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50PiBmcmFnbWVudHMgPSBmaWVsZERlY2xhcmF0aW9uLmZyYWdtZW50cygpOwotICAgICAgICBmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgOiBmcmFnbWVudHMpIHsKLSAgICAgICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMoZmllbGQuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlQW5ub3RhdGlvbk5hbWVzKEFubm90YXRpb24gbmV3QW5ub3RhdGlvbiwgQW5ub3RhdGlvbiBleGlzdGluZ0Fubm90YXRpb24pIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShleGlzdGluZ0Fubm90YXRpb24pLmVxdWFscygKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUobmV3QW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4ge0BsaW5rIEFubm90YXRpb259IGlzIHByZXNlbnQgb24gdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHByZXNlbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGphdmFFbGVtZW50LCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgYW5ub3RhdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIHByZXNlbnQgb24gdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgdGhlIGFubm90YXRpb24gbmFtZS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHByZXNlbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0Fubm90YXRpb25QcmVzZW50KCgoSUNvbXBpbGF0aW9uVW5pdClqYXZhRWxlbWVudCkuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb25OYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBlbGVtZW50VHlwZSA9IGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCk7Ci0KLSAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OCi0gICAgICAgICAgICAgICAgfHwgZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LlRZUEUKLSAgICAgICAgICAgICAgICB8fCBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9ECi0gICAgICAgICAgICAgICAgfHwgZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFCi0gICAgICAgICAgICAgICAgfHwgZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0KLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBnZXRBbm5vdGF0aW9ucyhqYXZhRWxlbWVudCk7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSB7QGxpbmsgQW5ub3RhdGlvbn0gdGhhdCBhcmUgcHJlc2VudCBvbiB0aGUgZ2l2ZW4ge0BsaW5rIElKYXZhRWxlbWVudH0KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50OgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5UWVBFPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkZJRUxEPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50Lk1FVEhPRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRTwvbGk+Ci0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgYW5ub3RhdGlvbnMuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PEFubm90YXRpb24+IGdldEFubm90YXRpb25zKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IEFubm90YXRpb25VdGlscy5nZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQoamF2YUVsZW1lbnQpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OKSB7Ci0gICAgICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gY29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2UoKTsKLSAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMoKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldFR5cGVEZWNsYXJhdGlvbih0eXBlKTsKLSAgICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBleHRyYWN0QW5ub3RhdGlvbnModHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChtZXRob2REZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RBbm5vdGF0aW9ucyhtZXRob2REZWNsYXJhdGlvbi5tb2RpZmllcnMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLSAgICAgICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEZpZWxkRGVjbGFyYXRpb24oZmllbGQpOwotICAgICAgICAgICAgaWYgKGZpZWxkRGVjbGFyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBleHRyYWN0QW5ub3RhdGlvbnMoZmllbGREZWNsYXJhdGlvbi5tb2RpZmllcnMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiA9IGdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oKElMb2NhbFZhcmlhYmxlKSBqYXZhRWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RBbm5vdGF0aW9ucyhzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLm1vZGlmaWVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEFubm90YXRpb24+IGV4dHJhY3RBbm5vdGF0aW9ucyhMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBleHRlbmRlZE1vZGlmaWVycykgewotICAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uPigpOwotICAgICAgICBmb3IgKElFeHRlbmRlZE1vZGlmaWVyIGV4dGVuZGVkTW9kaWZpZXIgOiBleHRlbmRlZE1vZGlmaWVycykgewotICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5hZGQoKEFubm90YXRpb24pIGV4dGVuZGVkTW9kaWZpZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHtAbGluayBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ufSBmb3IgdGhlIGdpdmVuIHtAbGluayBJTWV0aG9kfS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QuCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2Ygc2luZ2xlIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMoZmluYWwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIGZpbmFsIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4oKTsKLSAgICAgICAgY29tcGlsYXRpb25Vbml0LmFjY2VwdChuZXcgQVNUVmlzaXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZU1ldGhvZHMobWV0aG9kRGVjbGFyYXRpb24sIG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hZGRBbGwobWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIElMb2NhbFZhcmlhYmxlfSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHBvc2l0aW9uIGluIHRoZSBzb3VyY2UgZmlsZS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgaW4gd2hpY2ggdGhlIGxvY2FsIHZhcmlhYmxlIGlzIGRlY2xhcmVkLgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgbG9jYWwgdmFyaWFibGUgaW4gdGhlIHNvdXJjZSBmaWxlLgotICAgICAqIFRoZSBvZmZzZXQgbXVzdCBiZSA+PSB0byB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBsb2NhbCB2YXJpYWJsZSBhbmQKLSAgICAgKiA8PSB0aGUgbm9kZXMgc3RhcnQgcG9zaXRpb24gcGx1cyBsZW5ndGguCi0gICAgICogQHJldHVybiB0aGUgbG9jYWwgdmFyaWFibGUgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJTG9jYWxWYXJpYWJsZSBnZXRMb2NhbFZhcmlhYmxlKElNZXRob2QgbWV0aG9kLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IGdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG1ldGhvZCk7Ci0gICAgICAgIGZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICBpbnQgcGFyYW1ldGVyU3RhcnRQb3NpdGlvbiA9IHBhcmFtZXRlci5nZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgcGFyYW1ldGVyTGVuZ3RoID0gcGFyYW1ldGVyLmdldExlbmd0aCgpOwotICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBwYXJhbWV0ZXJTdGFydFBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICYmIG9mZnNldCA8PSBwYXJhbWV0ZXJTdGFydFBvc2l0aW9uICsgcGFyYW1ldGVyTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChJTG9jYWxWYXJpYWJsZSkgcGFyYW1ldGVyLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUxvY2FsVmFyaWFibGV9IHdpdGggdGhlIGdpdmVuIG5hbWUgd2l0aGluIHRoZSBkZWNsYXJlZCB7QGxpbmsgSU1ldGhvZH0uCi0gICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kIGluIHdoaWNoIHRoZSBsb2NhbCB2YXJpYWJsZSBpcyBkZWNsYXJlZC4KLSAgICAgKiBAcGFyYW0gcGFyYW1OYW1lIHRoZSBsb2NhbCB2YXJpYWJsZSBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIHZhcmlhYmxlIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUxvY2FsVmFyaWFibGUgZ2V0TG9jYWxWYXJpYWJsZShJTWV0aG9kIG1ldGhvZCwgU3RyaW5nIHBhcmFtTmFtZSkgewotICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBnZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ucyhtZXRob2QpOwotICAgICAgICBmb3IgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhwYXJhbU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChJTG9jYWxWYXJpYWJsZSkgcGFyYW1ldGVyLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBBU1Qge0BsaW5rIEFubm90YXRpb259IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcwotICAgICAqIG9uIHRoZSB7QGxpbmsgSUphdmFFbGVtZW50fS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50OgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTjwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5UWVBFPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkZJRUxEPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50Lk1FVEhPRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRTwvbGk+Ci0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBBU1QgYW5ub3RhdGlvbiBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBnZXRBbm5vdGF0aW9ucyhqYXZhRWxlbWVudCk7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhc3RBbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IGFzdEFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICAgICAgICAgIGlmICh0eXBlTmFtZS5lcXVhbHMoYW5ub3RhdGlvbi5nZXRDYW5vbmljYWxOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgIHx8IHR5cGVOYW1lLmVxdWFscyhhbm5vdGF0aW9uLmdldFNpbXBsZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYXN0QW5ub3RhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW5ub3RhdGlvbk1pcnJvcn0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4ge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IGNsYXNzCi0gICAgICogb24gdGhlIHtAbGluayBEZWNsYXJhdGlvbn0uCi0gICAgICogQHBhcmFtIGRlY2xhcmF0aW9uIHRoZSBkZWNsYXJhdGlvbgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gY2xhc3MuCi0gICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBtaXJyb3Igb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uTWlycm9yIGdldEFubm90YXRpb24oRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgOiBhYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgIGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiA9IGFubm90YXRpb25NaXJyb3IKLSAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uVHlwZSgpLmdldERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbk1pcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKRFQge0BsaW5rIElBbm5vdGF0aW9ufSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gY2xhc3MKLSAgICAgKiBvbiB0aGUge0BsaW5rIElBbm5vdGF0YWJsZX0gZWxlbWVudC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IGNsYXNzLgotICAgICAqIEBwYXJhbSBhbm5vdGF0YWJsZSBhIHBhY2thZ2UgZGVjbGFyYXRpb24sIGEgdHlwZSwgYSBtZXRob2QsIGEgZmllbGQgb3IgYSBsb2NhbCB2YXJpYWJsZSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuCi0gICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGUgYW5ub3RhdGFibGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElBbm5vdGF0aW9uIGdldEFubm90YXRpb24oQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb24sCi0gICAgICAgICAgICBJQW5ub3RhdGFibGUgYW5ub3RhdGFibGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gYW5ub3RhdGFibGUuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgZm9yIChJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGpkdEFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoYW5ub3RhdGlvbi5nZXRDYW5vbmljYWxOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhhbm5vdGF0aW9uLmdldFNpbXBsZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamR0QW5ub3RhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW5ub3RhdGlvblZhbHVlfSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSB0aGF0IGlzIGRlY2xhcmVkIHdpdGhpbiB0aGUge0BsaW5rIEFubm90YXRpb25NaXJyb3J9LgotICAgICAqIEBwYXJhbSBtaXJyb3IgdGhlIGFubm90YXRpb24gbWlycm9yLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIHZhbHVlIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvblZhbHVlIGdldEFubm90YXRpb25WYWx1ZShBbm5vdGF0aW9uTWlycm9yIG1pcnJvciwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLSAgICAgICAgTWFwPEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLCBBbm5vdGF0aW9uVmFsdWU+IHZhbHVlcyA9IG1pcnJvci5nZXRFbGVtZW50VmFsdWVzKCk7Ci0gICAgICAgIFNldDxNYXAuRW50cnk8QW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24sIEFubm90YXRpb25WYWx1ZT4+IGVudHJ5U2V0ID0gdmFsdWVzLmVudHJ5U2V0KCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLCBBbm5vdGF0aW9uVmFsdWU+IGVudHJ5IDogZW50cnlTZXQpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50LmdldFNpbXBsZU5hbWUoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbn0gbWVtYmVyIHZhbHVlIHBhaXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUuCi0gICAgICogQHBhcmFtIG5vcm1hbEFubm90YXRpb24gdGhlIG5vcm1hbCBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgdmFsdWUgcGFpciBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBleHByZXNzaW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbiBnZXRBbm5vdGF0aW9uVmFsdWUoTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5vcm1hbEFubm90YXRpb24udmFsdWVzKCk7Ci0gICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSkRUIHtAbGluayBJQW5ub3RhdGlvbn0gbWVtYmVyIHZhbHVlIHBhaXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUuCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbWVtYmVyIHZhbHVlIHBhaXJzIHZhbHVlLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBhbm5vdGF0aW9uIGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFubm90YXRpb25WYWx1ZShJQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIElNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0gICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGZvciAoSU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRNZW1iZXJOYW1lKCkuZXF1YWxzKG1lbWJlck5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUge0BsaW5rIE5vcm1hbEFubm90YXRpb259LgotICAgICAqIEBwYXJhbSBub3JtYWxBbm5vdGF0aW9uIHRoZSBub3JtYWwgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUgb2YgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHJldHVybi4KLSAgICAgKiBAcmV0dXJuIGEgbWVtYmVyIHZhbHVlIHBhaXIgb3IgbnVsbCBpZiBubyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBjYW4gYmUgZm91bmQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgZ2V0TWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlc1BhaXJzID0gbm9ybWFsQW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVzUGFpcnMpIHsKLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSB7QGxpbmsgQW5ub3RhdGlvbk1pcnJvcn0gYXMgYSB7QGxpbmsgU3RyaW5nfSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gbWlycm9yIHRoZSBhbm5vdGF0aW9uIG1pcnJvci4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgbWVtYmVyIHZhbHVlIGFzIGEgU3RyaW5nIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShBbm5vdGF0aW9uTWlycm9yIG1pcnJvciwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLSAgICAgICAgQW5ub3RhdGlvblZhbHVlIGFubm90YXRpb25WYWx1ZSA9IGdldEFubm90YXRpb25WYWx1ZShtaXJyb3IsIG1lbWJlck5hbWUpOwotICAgICAgICBpZiAoYW5ub3RhdGlvblZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSB7QGxpbmsgQW5ub3RhdGlvbn0gYXMgYSB7QGxpbmsgU3RyaW5nfSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgQVNUIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIG1lbWJlciB2YWx1ZSBhcyBhIFN0cmluZyBvciBudWxsIGlmIG5vIG1lbWJlciB3aXRoIHRoZSBtZW1iZXIgbmFtZSBjYW4gYmUgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pIHsKLSAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGdldEFubm90YXRpb25WYWx1ZSgoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgbWVtYmVyTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsICYmIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nTGl0ZXJhbCkgZXhwcmVzc2lvbikuZ2V0TGl0ZXJhbFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBJQW5ub3RhdGlvbn0gYXMgYSB7QGxpbmsgU3RyaW5nfSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgSkRUIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIG1lbWJlciB2YWx1ZSBhcyBhIFN0cmluZyBvciBudWxsIGlmIG5vIG1lbWJlciB3aXRoIHRoZSBtZW1iZXIgbmFtZSBjYW4gYmUgZm91bmQuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gIGlmIHRoZSBhbm5vdGF0aW9uIGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nCi0gICAgICogaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG1lbWJlck5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBPYmplY3QgdmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb24sIG1lbWJlck5hbWUpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBBbm5vdGF0aW9uTWlycm9yfSBhcyBhIHtAbGluayBCb29sZWFufSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gbWlycm9yIHRoZSBhbm5vdGF0aW9uIG1pcnJvci4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgbWVtYmVyIHZhbHVlIGFzIGEgQm9vbGVhbiBvciBudWxsIGlmIG5vIG1lbWJlciB3aXRoIHRoZSBtZW1iZXIgbmFtZSBjYW4gYmUgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCb29sZWFuIGdldEJvb2xlYW5WYWx1ZShBbm5vdGF0aW9uTWlycm9yIG1pcnJvciwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBtZW1iZXJOYW1lKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSB7QGxpbmsgQW5ub3RhdGlvbn0gYXMgYSB7QGxpbmsgQm9vbGVhbn0gdmFsdWUuCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIEFTVCBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZW1iZXIgdmFsdWUgYXMgYSBCb29sZWFuIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBnZXRBbm5vdGF0aW9uVmFsdWUoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIG1lbWJlck5hbWUpOwotICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCAmJiBleHByZXNzaW9uIGluc3RhbmNlb2YgQm9vbGVhbkxpdGVyYWwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCgoQm9vbGVhbkxpdGVyYWwpIGV4cHJlc3Npb24pLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBJQW5ub3RhdGlvbn0gYXMgYSB7QGxpbmsgQm9vbGVhbn0gdmFsdWUuCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIEpEVCBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZW1iZXIgdmFsdWUgYXMgYSBCb29sZWFuIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAgaWYgdGhlIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcKLSAgICAgKiBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKElBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb24sIG1lbWJlck5hbWUpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBBbm5vdGF0aW9ufSBhcyBhIHtAbGluayBTdHJpbmd9IHZhbHVlLgotICAgICAqIFRoZSByZXR1cm5lZCBTdHJpbmcgdmFsdWUgaXMgdGhlIG5hbWUgb2YgdGhlIGVudW0gY29uc3RhbnQuCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIEFTVCBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZW1iZXIgdmFsdWUgYXMgYSBTdHJpbmcgb3IgbnVsbCBpZiBubyBtZW1iZXIgd2l0aCB0aGUgbWVtYmVyIG5hbWUgY2FuIGJlIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVudW1WYWx1ZShBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZ2V0QW5ub3RhdGlvblZhbHVlKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBtZW1iZXJOYW1lKTsKLSAgICAgICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwgJiYgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChRdWFsaWZpZWROYW1lKSBleHByZXNzaW9uKS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lbWJlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSB7QGxpbmsgSUFubm90YXRpb259IGFzIGEge0BsaW5rIFN0cmluZ30gdmFsdWUuCi0gICAgICogVGhlIHJldHVybmVkIFN0cmluZyB2YWx1ZSBpcyB0aGUgbmFtZSBvZiB0aGUgZW51bSBjb25zdGFudC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgSkRUIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIG1lbWJlciB2YWx1ZSBhcyBhIFN0cmluZyBvciBudWxsIGlmIG5vIG1lbWJlciB3aXRoIHRoZSBtZW1iZXIgbmFtZSBjYW4gYmUgZm91bmQuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gIGlmIHRoZSBhbm5vdGF0aW9uIGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nCi0gICAgICogaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW51bVZhbHVlKElBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb24sIG1lbWJlck5hbWUpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5pbmRleE9mKCIuIikgIT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcodmFsdWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9Bbm5vdGF0aW9uc0NvcmVQcm9jZXNzb3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9wcm9jZXNzb3IvQW5ub3RhdGlvbnNDb3JlUHJvY2Vzc29yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjYzNjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9Bbm5vdGF0aW9uc0NvcmVQcm9jZXNzb3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvcnM7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29yZVByb2Nlc3NvckZhY3RvcnkgaW1wbGVtZW50cyBBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvblByb2Nlc3NvciBnZXRQcm9jZXNzb3JGb3IoU2V0PEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24+IGFubm90YXRpb25TZXQsCi0gICAgICAgICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgcHJvY2Vzc29yRW52aXJvbm1lbnQpIHsKLQotICAgIAlpZiAoYW5ub3RhdGlvblNldC5zaXplKCkgPT0gMCkgewotICAgIAkJcmV0dXJuIEFubm90YXRpb25Qcm9jZXNzb3JzLk5PX09QOwotICAgIAl9Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvblByb2Nlc3Nvcj4gYW5ub3RhdGlvblByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25Qcm9jZXNzb3I+KCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+PiBhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUgPQotICAgICAgICAgICAgQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25Qcm9jZXNzb3JzQ2FjaGUoKTsKLQotICAgICAgICBmb3IgKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiA6IGFubm90YXRpb25TZXQpIHsKLSAgICAgICAgICAgIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBwcm9jZXNzb3JFbGVtZW50cyA9IGFubm90YXRpb25Qcm9jZXNzb3JDYWNoZS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQotICAgICAgICAgICAgZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQgOiBwcm9jZXNzb3JFbGVtZW50cykgewotICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gZ2V0QW5ub3RhdGlvblByb2Nlc3Nvcihjb25maWd1cmF0aW9uRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JFbnZpcm9ubWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NvcnMuYWRkKHByb2Nlc3Nvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblByb2Nlc3NvcnMuZ2V0Q29tcG9zaXRlQW5ub3RhdGlvblByb2Nlc3Nvcihhbm5vdGF0aW9uUHJvY2Vzc29ycyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uUHJvY2Vzc29yIGdldEFubm90YXRpb25Qcm9jZXNzb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50LAotICAgICAgICAgICAgQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IHByb2Nlc3NvckVudmlyb25tZW50KSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIGFubm90YXRpb25Qcm9jZXNzb3IgPQotICAgICAgICAgICAgICAgICAgKEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvciljb25maWd1cmF0aW9uRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc29yLnNldEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudChwcm9jZXNzb3JFbnZpcm9ubWVudCk7Ci0gICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uUHJvY2Vzc29yOwotICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBzdXBwb3J0ZWRBbm5vdGF0aW9uVHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvblByb2Nlc3NvcnNDYWNoZSgpLmtleVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gc3VwcG9ydGVkT3B0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjFkMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5YjY5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTRmOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1MiBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjJiMDQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjQuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5DWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNC4zIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9idWphdmEucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfYnVqYXZhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjY0YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9idWphdmEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIFNoYW5lIENsYXJrZSAtIEFwYWNoZSBDWEYgc3VwcG9ydAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIS0tIFNjZW5hcmlvVHlwZSBSRVFVSVJFRC4gRGlmZmVyZW50aWF0ZXMgZnJvbSAiY2xpZW50IiBzY2VuYXJpby4KLVNjZW5hcmlvVHlwZT1zZXJ2aWNlCi0KLSEtLSBJbml0aWFsU2VsZWN0aW9uIFJFUVVJUkVELiAgV29ya3NwYWNlIHJlbGF0aXZlIFVSSSB0byB0aGUgaW5wdXQgV1NETCBvciBKYXZhCi1Jbml0aWFsU2VsZWN0aW9uPS9keW5hbWljV2ViUHJvamVjdE5hbWUvc3JjL3BhY2thZ2VuYW1lL215U2VydmljZS5qYXZhCi0KLSEtLVV0aWxpdHkgcHJvcGVydHkgdmFsdWVzIC0gdXNlIHRoZXNlIHRvIGxpc3QgdmFsaWQgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0hLS0gU2VydmljZS5SdW50aW1lSWQsIFNlcnZpY2UuU2VydmVySWQgCi1MaXN0UnVudGltZXM9dHJ1ZQotTGlzdFNlcnZlcnM9dHJ1ZQotIS0tIFZlcmJvc2Ugd2lsbCBsaXN0IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgYXMgd2VsbCBhcyBlcnJvcnMgaWYgc2V0IHRvIHRydWUKLVZlcmJvc2U9dHJ1ZQotCi0hLS0gIFNlcnZpY2UuUnVudGltZUlkIC0gSUQgb2Ygd2ViIHNlcnZpY2UgcnVudGltZSAKLVNlcnZpY2UuUnVudGltZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3hmV2ViU2VydmljZVJUCi0hLS0gU2VydmljZS5TZXJ2ZXJJZCAtICBJRCBvZiB0YXJnZXQgc2VydmVyIAotU2VydmljZS5TZXJ2ZXJJZD1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC42MAotIS0tIFNlcnZpY2UuVHlwZUlkIC0gSmF2YSBCZWFuIGlzIGRlZmF1bHQgZm9yIGJvdGggVG9wIERvd24gYW5kIEJvdHRvbSBVcAotIS0tIFNlcnZpY2UuVHlwZUlkPUphdmEgQmVhbgotCi0hLS0gU2VydmljZVByb2plY3ROYW1lIC0gIS0tdHlwZTpTdHJpbmcgLSBuYW1lIG9mIFNlcnZpY2UgcHJvamVjdCAtIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB0aGUgc2VydmljZSBwcm9qZWN0IGEgZGlmZmVyZW50IG5hbWUgdGhhbiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBpbml0aWFsIHNlbGVjdGlvbi4gIHR5cGU6IFN0cmluZyAgICAKLSEtLVNlcnZpY2VQcm9qZWN0TmFtZT1zZXJ2aWNlUHJvamVjdE5hbWUKLSEtLSBTZXJ2aWNlRWFyUHJvamVjdE5hbWUgLSAhLS10eXBlOlN0cmluZyAtIG5hbWUgb2YgU2VydmljZSBFQVIgcHJvamVjdCAtIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB0aGUgc2VydmljZSBFQVIgcHJvamVjdCBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIEVBUiBwcm9qZWN0IGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlIHByb2plY3QuICB0eXBlOiBTdHJpbmcKLSEtLVNlcnZpY2VFYXJQcm9qZWN0TmFtZT1zZXJ2aWNlRWFyUHJvamVjdE5hbWUKLQotIS0tIEdlbmVyYXRlIGEgY2xpZW50IG1haW5saW5lIHVzaW5nIEpBWC1XUyBBUElzCi0hLS1HZW5DbGllbnQ9ZmFsc2UKLSEtLSBHZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJcwotIS0tR2VuU2VydmVyPWZhbHNlCi0hLS0gU3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbnMKLSEtLUdlbldyYXBwZXJGYXVsdEJlYW5zPXRydWUKLSEtLSBTcGVjaWZ5IHRvIGdlbmVyYXRlIHRoZSBXU0RMIGZpbGUKLSEtLUdlbldTREw9dHJ1ZQotIS0tIE91dHB1dCBzY2hlbWFzIHRvIHNlcGFyYXRlIGZpbGVzIGFuZCB1c2UgaW1wb3J0cyB0byBsb2FkIHRoZW0gaW5zdGVhZCBvZiBpbmxpbmluZyB0aGVtIGludG8gdGhlIHdzZGwKLSEtLUdlblhTREltcG9ydHM9dHJ1ZQotIS0tU3BlY2lmaWVzIHRoYXQgdGhlIGdlbmVyYXRlZCBXU0RMIGlzIHRvIGluY2x1ZGUgYSBTT0FQIDEuMiBiaW5kaW5nCi0hLS1Vc2VTT0FQMTJCaW5kaW5nPWZhbHNlCi0hLS1TZXQgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBXU0RMIGZpbGUKLSEtLVdzZGxGaWxlTmFtZT1teVdTRExGaWxlTmFtZS53c2RsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2J1amF2YS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2J1amF2YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNWY4YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9idWphdmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCi08ZWNobyBtZXNzYWdlPSJwdWxsaW5nIGluIHByb3BlcnR5IGZpbGVzIi8+Ci08cHJvcGVydHkgZmlsZT0iY3hmX2J1amF2YS5wcm9wZXJ0aWVzIi8+Ci0JCi08ZWNobyBtZXNzYWdlPSJjYWxsaW5nIHRoZSB3ZWIgc2VydmljZXMgZ2VuZXJhdGlvbiBhbnQgdGFzazogY3hmX2J1amF2YSIvPgotIDx0YXJnZXQgbmFtZT0ibWFpbiIgPgotICAJIDx3c2dlbi8+Ci0gIDwvdGFyZ2V0PgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfY2xpZW50LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2NsaWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDI5MmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfY2xpZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBTaGFuZSBDbGFya2UgLSBBcGFjaGUgQ1hGIHN1cHBvcnQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLVNjZW5hcmlvVHlwZSBSRVFVSVJFRC4gRGlmZmVyZW50aWF0ZXMgZnJvbSAic2VydmljZSIgc2NlbmFyaW8uCi1TY2VuYXJpb1R5cGU9Y2xpZW50Ci0KLSEtLUluaXRpYWxTZWxlY3Rpb24gUkVRVUlSRUQuICBXb3Jrc3BhY2UgcmVsYXRpdmUgVVJJIHRvIHRoZSBpbnB1dCBXU0RMIG9yIEphdmEuCi1Jbml0aWFsU2VsZWN0aW9uPS9keW5hbWljV2ViUHJvamVjdE5hbWUvV2ViQ29udGVudC93c2RsL215U2VydmljZS53c2RsCi0KLSEtLVV0aWxpdHkgcHJvcGVydHkgdmFsdWVzIC0gdXNlIHRoZXNlIHRvIGxpc3QgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0hLS0gQ2xpZW50LlJ1bnRpbWVJZCwgQ2xpZW50LlNlcnZlcklkIAotTGlzdFJ1bnRpbWVzPXRydWUKLUxpc3RTZXJ2ZXJzPXRydWUKLSEtLSBWZXJib3NlIHdpbGwgbGlzdCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFzIHdlbGwgYXMgZXJyb3JzIGlmIHNldCB0byB0cnVlCi1WZXJib3NlPXRydWUKLSAKLSEtLUNsaWVudC5SdW50aW1lSWQgLSBJRCBvZiB3ZWIgc2VydmljZSBydW50aW1lIAotQ2xpZW50LlJ1bnRpbWVJZD1vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmN4ZldlYlNlcnZpY2VSVAotIS0tQ2xpZW50LlNlcnZlcklkIC0gSUQgb2YgdGFyZ2V0IHNlcnZlciAKLUNsaWVudC5TZXJ2ZXJJZD1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC42MAotCi0hLS1DbGllbnRQcm9qZWN0TmFtZSAtIG5hbWUgb2YgQ2xpZW50IHByb2plY3QgLSB0aGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIGNsaWVudCBwcm9qZWN0IGEgCi0hLS0gZGlmZmVyZW50IG5hbWUgdGhhbiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBpbml0aWFsIHNlbGVjdGlvbgotIS0tQ2xpZW50UHJvamVjdE5hbWU9Y2xpZW50UHJvamVjdE5hbWUKLQotIS0tQ2xpZW50RWFyUHJvamVjdE5hbWUtIG5hbWUgb2YgQ2xpZW50IEVBUiBwcm9qZWN0IC0gc2V0IG9ubHkgaWYgYXBwbGljYWJsZSBmb3Igc2VsZWN0ZWQgc2VydmVyIHR5cGUKLSEtLUNsaWVudEVhclByb2plY3ROYW1lPWNsaWVudEVBUlByb2plY3ROYW1lCi0KLSEtLUNsaWVudENvbXBvbmVudFR5cGUgLSB0eXBlIG9mIENsaWVudCBwcm9qZWN0Ci0hLS1DbGllbnRDb21wb25lbnRUeXBlPXRlbXBsYXRlLmN4Zi5jb3JlCi0KLSEtLSBKYXZhT3V0cHV0Ci0hLS0gVG9wIGRvd24gLSBTdHJpbmc6IHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgVVJJIGZvciBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUgLSBtdXN0IGJlIGV4aXN0aW5nIHdvcmtzcGFjZSBzb3VyY2UgZm9sZGVyCi0hLS1KYXZhT3V0cHV0PS9wcm9qZWN0TmFtZS9KYXZhU291cmNlCi0KLSEtLUdlbmVyYXRlIENsaWVudCA6IFJFUVVJUkVECi1HZW5DbGllbnQ9dHJ1ZQotCi0hLS1HZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJcwotIS0tR2VuU2VydmVyPWZhbHNlCi0hLS1HZW5lcmF0ZSBzdGFydGluZyBwb2ludCBjb2RlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QKLSEtLUdlbkltcGw9dHJ1ZQotIS0tR2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFuZCBjbGllbnQuIElnbm9yZWQgaWYgaW1wbGVtZW50YXRpb24gb3IgY2xpZW50IGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKLSEtLURlZmF1bHRWYWx1ZXM9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBwcm9jZXNzaW5nIG9mIGV4dGVuZGVkIHNvYXAgaGVhZGVyIG1lc3NhZ2UgYmluZGluZwotIS0tRXh0U09BUEhlYWRlcnM9ZmFsc2UKLSEtLUVuYWJsZXMgb3IgZGlzYWJsZXMgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcKLSEtLURlZmF1bHROYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nCi0hLS1EZWZhdWx0RXhjbHVkZXNOYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlIEF1dG8gTmFtZSBSZXNvbHV0aW9uCi0hLS1BdXRvTmFtZVJlc29sdXRpb249ZmFsc2UKLQotIS0tU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgV1NETCBzZXJ2aWNlIGZvciB3aGljaCBjb2RlIGlzIHRvIGJlIGdlbmVyYXRlZC4gVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgZXZlcnkgc2VydmljZSBpbiB0aGUgV1NETCBkb2N1bWVudAotIS0tU2VydmljZU5hbWU9bXlTZXJ2aWNlCi0KLSEtLVhKQyBBcmdzOiBTcGVjaWZ5IHRoZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBYSkMKLQotIS0tSW5pdGlhbGlzZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcwotIS0teGpjX2R2PWZhbHNlCi0hLS1BY3RpdmF0ZSBwbHVnaW4gdG8gYWRkIGEgdG9TdHJpbmcoKSBtZXRob2QgdG8gZ2VuZXJhdGVkIGNsYXNzZXMKLSEtLXhqY190cz1mYWxzZQotIS0tSGF2ZSB0b1N0cmluZyBwcm9kdWNlIG11bHRpIGxpbmUgb3V0cHV0Ci0hLS14amNfdHNfbXVsdGk9ZmFsc2UKLSEtLUhhdmUgdG9TdHJpbmcgcHJvZHVjZSBzaW5nbGUgbGluZSB0ZXJzZSBvdXRwdXQKLSEtLXhqY190c19zaW1wbGU9ZmFsc2UKLSEtLUVuYWJsZSBzb3VyY2UgbG9jYXRpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGVkIGNvZGUKLSEtLXhqY19sb2NhdG9yPWZhbHNlCi0hLS1HZW5lcmF0ZSBhY2Nlc3NvciBtZXRob2RzIHdpdGggdGhlICdzeW5jaHJvbml6ZWQnIGtleXdvcmQKLSEtLXhqY19zeW5jX21ldGhvZHM9ZmFsc2UKLSEtLUFkZCBAR2VuZXJhdGVkIGFubm90YXRpb25zIHRvIHRoZSBnZW5lcmF0ZWQgY29kZQotIS0teGpjX21hcmtfZ2VuZXJhdGVkPWZhbHNlCi0KLSEtLSBNYXBwaW5ncwotIS0tIFRvcCBkb3duIHNjZW5hcmlvLiBXb3Jrc3BhY2UgcmVsYXRpdmUgVVJJIHRvIHByb3BlcnR5IGZpbGUgY29udGFpbmluZyBtYXBwaW5ncy4KLSEtLSBNYXBwaW5ncyBhcmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwYWNrYWdlIG5hbWVzIG9mIHRoZSBnZW5lcmF0ZWQgSmF2YSB0ZW1wbGF0ZSBjbGFzc2VzLgotIS0tIFRoZSBjb250ZW50IG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGUgbXVzdCBiZSBvZiB0aGUgZm9ybWF0IG5hbWVzcGFjZT1wYWNrYWdlICAKLSEtLU1hcHBpbmdzPS9keW5hbWljV2ViUHJvamVjdE5hbWUvbWFwcGluZ3MudHh0Ci0KLSEtLUJpbmRpbmcgRmlsZXMuIENvbW1hIGRlbGltaXRlZCBzdHJpbmcgb2YgYWJzb2x1dGUgcGF0aHMgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIEpBWFdTIG9yIEpBWEIgYmluZGluZyBmaWxlcy4KLSEtLUJpbmRpbmdzPUM6L3dvcmtzcGFjZTEvZHluYW1pY1dlYlByb2plY3ROYW1lL2JpbmRpbmcxLnhtbCxDOi93b3Jrc3BhY2UxL2R5bmFtaWNXZWJQcm9qZWN0TmFtZS9iaW5kaW5nMi54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2NsaWVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2NsaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2E1NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9jbGllbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCi08ZWNobyBtZXNzYWdlPSJwdWxsaW5nIGluIHByb3BlcnR5IGZpbGVzIi8+Ci08cHJvcGVydHkgZmlsZT0iY3hmX2NsaWVudC5wcm9wZXJ0aWVzIi8+Ci0JCi08ZWNobyBtZXNzYWdlPSJjYWxsaW5nIHRoZSB3ZWIgc2VydmljZXMgZ2VuZXJhdGlvbiBhbnQgdGFzazogY3hmX2NsaWVudCIvPgotIDx0YXJnZXQgbmFtZT0ibWFpbiIgPgotICAJIDx3c2dlbi8+Ci0gIDwvdGFyZ2V0PgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX3RkamF2YS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTZlODg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBTaGFuZSBDbGFya2UgLSBBcGFjaGUgQ1hGIHN1cHBvcnQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBTY2VuYXJpb1R5cGUgUkVRVUlSRUQuIERpZmZlcmVudGlhdGVzIGZyb20gImNsaWVudCIgc2NlbmFyaW8uCi1TY2VuYXJpb1R5cGU9c2VydmljZQotCi0hLS0gSW5pdGlhbFNlbGVjdGlvbiBSRVFVSVJFRC4gIFdvcmtzcGFjZSByZWxhdGl2ZSBVUkkgdG8gdGhlIGlucHV0IFdTREwgb3IgSmF2YQotSW5pdGlhbFNlbGVjdGlvbj0vZHluYW1pY1dlYlByb2plY3ROYW1lL1dlYkNvbnRlbnQvd3NkbC9teVNlcnZpY2Uud3NkbAotCi0hLS1VdGlsaXR5IHByb3BlcnR5IHZhbHVlcyAtIHVzZSB0aGVzZSB0byBsaXN0IHZhbGlkIHZhbHVlcyBmb3IgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotIS0tIFNlcnZpY2UuUnVudGltZUlkLCBTZXJ2aWNlLlNlcnZlcklkIAotTGlzdFJ1bnRpbWVzPXRydWUKLUxpc3RTZXJ2ZXJzPXRydWUKLSEtLSBWZXJib3NlIHdpbGwgbGlzdCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFzIHdlbGwgYXMgZXJyb3JzIGlmIHNldCB0byB0cnVlCi1WZXJib3NlPXRydWUKLQotIS0tICBTZXJ2aWNlLlJ1bnRpbWVJZCAtIElEIG9mIHdlYiBzZXJ2aWNlIHJ1bnRpbWUgCi1TZXJ2aWNlLlJ1bnRpbWVJZD1vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmN4ZldlYlNlcnZpY2VSVAotIS0tIFNlcnZpY2UuU2VydmVySWQgLSAgSUQgb2YgdGFyZ2V0IHNlcnZlciAKLVNlcnZpY2UuU2VydmVySWQ9b3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNjAKLSEtLSBTZXJ2aWNlLlR5cGVJZCAtIEphdmEgQmVhbiBpcyBkZWZhdWx0IGZvciBib3RoIFRvcCBEb3duIGFuZCBCb3R0b20gVXAKLSEtLSBTZXJ2aWNlLlR5cGVJZD1KYXZhIEJlYW4KLQotIS0tIFNlcnZpY2VQcm9qZWN0TmFtZSAtICEtLXR5cGU6U3RyaW5nIC0gbmFtZSBvZiBTZXJ2aWNlIHByb2plY3QgLSB0aGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIHNlcnZpY2UgcHJvamVjdCBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgaW5pdGlhbCBzZWxlY3Rpb24uICB0eXBlOiBTdHJpbmcgICAgCi0hLS1TZXJ2aWNlUHJvamVjdE5hbWU9c2VydmljZVByb2plY3ROYW1lCi0hLS0gU2VydmljZUVhclByb2plY3ROYW1lIC0gIS0tdHlwZTpTdHJpbmcgLSBuYW1lIG9mIFNlcnZpY2UgRUFSIHByb2plY3QgLSB0aGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIHNlcnZpY2UgRUFSIHByb2plY3QgYSBkaWZmZXJlbnQgbmFtZSB0aGFuIHRoZSBFQVIgcHJvamVjdCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZSBwcm9qZWN0LiAgdHlwZTogU3RyaW5nCi0hLS1TZXJ2aWNlRWFyUHJvamVjdE5hbWU9c2VydmljZUVhclByb2plY3ROYW1lCi0KLSEtLSBKYXZhT3V0cHV0Ci0hLS0gVG9wIGRvd24gLSBTdHJpbmc6IHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgVVJJIGZvciBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUgLSBtdXN0IGJlIGV4aXN0aW5nIHdvcmtzcGFjZSBzb3VyY2UgZm9sZGVyCi0hLS1KYXZhT3V0cHV0PS9wcm9qZWN0TmFtZS9KYXZhU291cmNlCi0KLSEtLVNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIFdTREwgc2VydmljZSBmb3Igd2hpY2ggY29kZSBpcyB0byBiZSBnZW5lcmF0ZWQuIFRoZSBkZWZhdWx0IGlzIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGV2ZXJ5IHNlcnZpY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQKLSEtLVNlcnZpY2VOYW1lPW15U2VydmljZQotCi0hLS1HZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJcwotIS0tR2VuU2VydmVyPWZhbHNlCi0hLS1HZW5lcmF0ZSBzdGFydGluZyBwb2ludCBjb2RlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QKLSEtLUdlbkltcGw9dHJ1ZQotIS0tR2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFuZCBjbGllbnQuIElnbm9yZWQgaWYgaW1wbGVtZW50YXRpb24gb3IgY2xpZW50IGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKLSEtLURlZmF1bHRWYWx1ZXM9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBwcm9jZXNzaW5nIG9mIGV4dGVuZGVkIHNvYXAgaGVhZGVyIG1lc3NhZ2UgYmluZGluZwotIS0tRXh0U09BUEhlYWRlcnM9ZmFsc2UKLSEtLUVuYWJsZXMgb3IgZGlzYWJsZXMgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcKLSEtLURlZmF1bHROYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nCi0hLS1EZWZhdWx0RXhjbHVkZXNOYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlIEF1dG8gTmFtZSBSZXNvbHV0aW9uCi0hLS1BdXRvTmFtZVJlc29sdXRpb249ZmFsc2UKLQotIS0tWEpDIEFyZ3M6IFNwZWNpZnkgdGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIFhKQwotCi0hLS1Jbml0aWFsaXNlIGZpZWxkcyBtYXBwZWQgZnJvbSBlbGVtZW50cyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzCi0hLS14amNfZHY9ZmFsc2UKLSEtLUFjdGl2YXRlIHBsdWdpbiB0byBhZGQgYSB0b1N0cmluZygpIG1ldGhvZCB0byBnZW5lcmF0ZWQgY2xhc3NlcwotIS0teGpjX3RzPWZhbHNlCi0hLS1IYXZlIHRvU3RyaW5nIHByb2R1Y2UgbXVsdGkgbGluZSBvdXRwdXQKLSEtLXhqY190c19tdWx0aT1mYWxzZQotIS0tSGF2ZSB0b1N0cmluZyBwcm9kdWNlIHNpbmdsZSBsaW5lIHRlcnNlIG91dHB1dAotIS0teGpjX3RzX3NpbXBsZT1mYWxzZQotIS0tRW5hYmxlIHNvdXJjZSBsb2NhdGlvbiBzdXBwb3J0IGZvciBnZW5lcmF0ZWQgY29kZQotIS0teGpjX2xvY2F0b3I9ZmFsc2UKLSEtLUdlbmVyYXRlIGFjY2Vzc29yIG1ldGhvZHMgd2l0aCB0aGUgJ3N5bmNocm9uaXplZCcga2V5d29yZAotIS0teGpjX3N5bmNfbWV0aG9kcz1mYWxzZQotIS0tQWRkIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMgdG8gdGhlIGdlbmVyYXRlZCBjb2RlCi0hLS14amNfbWFya19nZW5lcmF0ZWQ9ZmFsc2UKLQotIS0tIE1hcHBpbmdzCi0hLS0gVG9wIGRvd24gc2NlbmFyaW8uIFdvcmtzcGFjZSByZWxhdGl2ZSBVUkkgdG8gcHJvcGVydHkgZmlsZSBjb250YWluaW5nIG1hcHBpbmdzLgotIS0tIE1hcHBpbmdzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBhY2thZ2UgbmFtZXMgb2YgdGhlIGdlbmVyYXRlZCBKYXZhIHRlbXBsYXRlIGNsYXNzZXMuCi0hLS0gVGhlIGNvbnRlbnQgb2YgdGhlIHByb3BlcnRpZXMgZmlsZSBtdXN0IGJlIG9mIHRoZSBmb3JtYXQgbmFtZXNwYWNlPXBhY2thZ2UgIAotIS0tTWFwcGluZ3M9L2R5bmFtaWNXZWJQcm9qZWN0TmFtZS9tYXBwaW5ncy50eHQKLQotIS0tQmluZGluZyBGaWxlcy4gQ29tbWEgZGVsaW1pdGVkIHN0cmluZyBvZiBhYnNvbHV0ZSBwYXRocyBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gb2YgSkFYV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzLgotIS0tQmluZGluZ3M9Qzovd29ya3NwYWNlMS9keW5hbWljV2ViUHJvamVjdE5hbWUvYmluZGluZzEueG1sLEM6L3dvcmtzcGFjZTEvZHluYW1pY1dlYlByb2plY3ROYW1lL2JpbmRpbmcyLnhtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3OWM2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX3RkamF2YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLTxlY2hvIG1lc3NhZ2U9InB1bGxpbmcgaW4gcHJvcGVydHkgZmlsZXMiLz4KLTxwcm9wZXJ0eSBmaWxlPSJjeGZfdGRqYXZhLnByb3BlcnRpZXMiLz4KLQkKLTxlY2hvIG1lc3NhZ2U9ImNhbGxpbmcgdGhlIHdlYiBzZXJ2aWNlcyBnZW5lcmF0aW9uIGFudCB0YXNrOiBjeGZfdGRqYXZhIi8+Ci0gPHRhcmdldCBuYW1lPSJtYWluIiA+Ci0gIAkgPHdzZ2VuLz4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYWQ1Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYW50LwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1ZjZjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ29uc3VtcHRpb24gQ29yZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLVdFQl9TRVJWSUNFX0xPQ0FUT1JfQ1hGPUFwYWNoZSBDWEYgV2ViIFNlcnZpY2UgTG9jYXRvcgotV0VCX1NFUlZJQ0VfTE9DQVRPUl9DQVRFR09SWV9DWEY9QXBhY2hlIENYRiBDb21wb25lbnRzCi0KLUxBQkVMX1JVTlRJTUVfQ1hGPUFwYWNoZSBDWEYKLUxBQkVMX0JPVFRPTV9VUF9KQVZBX0JFQU49Qm90dG9tIHVwIEphdmEgYmVhbiBXZWIgU2VydmljZQotTEFCRUxfVE9QX0RPV05fSkFWQV9CRUFOPVRvcCBkb3duIEphdmEgYmVhbiBXZWIgU2VydmljZQotTEFCRUxfQ0xJRU5UPUNsaWVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzc0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzLmxvY2F0b3IiPgotICAgICAgPHdlYlNlcnZpY2VMb2NhdG9yQ2F0ZWdvcnkKLSAgICAgICAgIGlkPSJ3cy5sb2NhdG9yLmNhdGVnb3J5LmN4ZiIKLSAgICAgICAgIGxhYmVsPSIlV0VCX1NFUlZJQ0VfTE9DQVRPUl9DQVRFR09SWV9DWEYiLz4KLQotICAgICAgPHdlYlNlcnZpY2VMb2NhdG9yCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmxvY2F0b3IuQ1hGV2ViU2VydmljZUxvY2F0b3IiCi0gICAgICAgICBpZD0id3MubG9jYXRvci5jeGYiCi0gICAgICAgICBjYXRlZ29yeT0id3MubG9jYXRvci5jYXRlZ29yeS5jeGYiCi0gICAgICAgICBsYWJlbD0iJVdFQl9TRVJWSUNFX0xPQ0FUT1JfQ1hGIj4KLSAgICAgIDwvd2ViU2VydmljZUxvY2F0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmFudGZpbGVzIj4KLSAgICAgIDxhbnRmaWxlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY3hmV2ViU2VydmljZVJUQlVKYXZhIgotICAgIAkgcnVudGltZWlkPSJjeGYiCi0gICAgCSBwbHVnaW5sb2NhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIgotICAgIAkgcGF0aD0iYW50L2N4Zl9idWphdmEucHJvcGVydGllcyIKLSAgICAJIHdzZ2VucGF0aD0iYW50L2N4Zl9idWphdmEueG1sIgotICAgIAkgcnVudGltZWxhYmVsPSIlTEFCRUxfUlVOVElNRV9DWEYiCi0gICAgCSBzY2VuYXJpb2xhYmVsPSIlTEFCRUxfQk9UVE9NX1VQX0pBVkFfQkVBTiI+Ci0gIAkgIDwvYW50ZmlsZXM+Ci0gICAgICA8YW50ZmlsZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmN4ZldlYlNlcnZpY2VSVFRvcEphdmEiCi0gICAgICAgICBydW50aW1laWQ9ImN4ZiIKLSAgICAgICAgIHBsdWdpbmxvY2F0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiCi0gICAgICAgICBwYXRoPSJhbnQvY3hmX3RkamF2YS5wcm9wZXJ0aWVzIgotICAgICAgICAgd3NnZW5wYXRoPSJhbnQvY3hmX3RkamF2YS54bWwiCi0gICAgICAgICBydW50aW1lbGFiZWw9IiVMQUJFTF9SVU5USU1FX0NYRiIKLSAgICAgICAgIHNjZW5hcmlvbGFiZWw9IiVMQUJFTF9UT1BfRE9XTl9KQVZBX0JFQU4iPgotICAJICA8L2FudGZpbGVzPgotICAJICA8YW50ZmlsZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmN4ZldlYlNlcnZpY2VSVFpDbGllbnQiCi0gICAgICAgICBydW50aW1laWQ9ImN4ZiIKLSAgICAgICAgIHBsdWdpbmxvY2F0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiCi0gICAgICAgICBwYXRoPSJhbnQvY3hmX2NsaWVudC5wcm9wZXJ0aWVzIgotICAgICAgICAgd3NnZW5wYXRoPSJhbnQvY3hmX2NsaWVudC54bWwiCi0gICAgICAgICBydW50aW1lbGFiZWw9IiVMQUJFTF9SVU5USU1FX0NYRiIKLSAgICAgICAgIHNjZW5hcmlvbGFiZWw9IiVMQUJFTF9DTElFTlQiPgotICAgICAgPC9hbnRmaWxlcz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZWIwMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIENYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMuQlVORExFX05BTUUsIENYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5ODBiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyMGZlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4gcGx1Z2luOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4oKSB7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgZXhjZXB0aW9uLnRvU3RyaW5nKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ2xpZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDbGllbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjVmZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDbGllbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlcy5KYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ29tbWFuZExpbmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5MYXVuY2hVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIEV4ZWN1dGVzIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmN4Zi50b29scy53c2RsdG8uV1NETFRvSmF2YTwvY29kZT4gY29tbWFuZCB3aXRoIHRoZSBhcmd1bWVudHMKLSAqIG5lY2Vzc2FyeSB0byBnZW5lcmF0ZSBhIGNsaWVudC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9UT09MX0NMQVNTX05BTUUgPSAib3JnLmFwYWNoZS5jeGYudG9vbHMud3NkbHRvLldTRExUb0phdmEiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+V1NETDJKYXZhQ2xpZW50Q29tbWFuZDwvY29kZT4gb2JqZWN0LgotICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgPGNvZGU+V1NETDJKYXZhRGF0YU1vZGVsPC9jb2RlPiB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24KLSAgICAgKiBiZXR3ZWVuIGNvbW1hbmRzLgotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnRDb21tYW5kKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIobmV3IFBhdGgobW9kZWwuZ2V0SmF2YVNvdXJjZUZvbGRlcigpKSk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotICAgICAgICBTdHJpbmdbXSBwcm9nQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0V1NETDJKYXZhR2VuZXJhdGVDbGllbnRBcmd1bWVudHMobW9kZWwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotCi0gICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBMYXVuY2hVdGlscy5sYXVuY2goamF2YVByb2plY3QsIFdTREwySmF2YUNsaWVudENvbW1hbmQuQ1hGX1RPT0xfQ0xBU1NfTkFNRSwgcHJvZ0FyZ3MpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlXMkpGaWxlc0Zyb21UbXAodGhpcy5tb2RlbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIExpc3Q8SVJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0gICAgICAgIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIGlmIChjaGFuZ2VkUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLy9BTlQgRW52aXJvbm1lbnQgTWFwcGluZ3MKLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU291cmNlRm9sZGVyKFN0cmluZyBqYXZhU291cmNlRm9sZGVyKSB7Ci0gICAgICAgIG1vZGVsLnNldEphdmFTb3VyY2VGb2xkZXIoamF2YVNvdXJjZUZvbGRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIG1vZGVsLnNldFNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlcihib29sZWFuIGdlbmVyYXRlU2VydmVyKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGdlbmVyYXRlU2VydmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUNsaWVudChib29sZWFuIGdlbmVyYXRlQ2xpZW50KSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGdlbmVyYXRlQ2xpZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGJvb2xlYW4gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbikgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGdlbmVyYXRlSW1wbGVtZW50YXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB1c2VEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIG1vZGVsLnNldFVzZURlZmF1bHRWYWx1ZXModXNlRGVmYXVsdFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKGJvb2xlYW4gcHJvY2Vzc1NPQVBIZWFkZXJzKSB7Ci0gICAgICAgIG1vZGVsLnNldFByb2Nlc3NTT0FQSGVhZGVycyhwcm9jZXNzU09BUEhlYWRlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGJvb2xlYW4gbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpIHsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcobG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGJvb2xlYW4gbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpIHsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcobG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9OYW1lUmVzb2x1dGlvbihib29sZWFuIGF1dG9OYW1lUmVzb2x1dGlvbikgewotICAgICAgICBtb2RlbC5zZXRBdXRvTmFtZVJlc29sdXRpb24oYXV0b05hbWVSZXNvbHV0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4geGpjVXNlRGVmYXVsdFZhbHVlcykgewotICAgICAgICBtb2RlbC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKHhqY1VzZURlZmF1bHRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nKGJvb2xlYW4geGpjVG9TdHJpbmcpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdTaW1wbGUoeGpjVG9TdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nU2ltcGxlKGJvb2xlYW4geGpjVG9TdHJpbmdTaW1wbGUpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdTaW1wbGUoeGpjVG9TdHJpbmdTaW1wbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGJvb2xlYW4geGpjVG9TdHJpbmdNdWx0aUxpbmUpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoeGpjVG9TdHJpbmdNdWx0aUxpbmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY0xvY2F0b3IoYm9vbGVhbiB4amNMb2NhdG9yKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY0xvY2F0b3IoeGpjTG9jYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjU3luY01ldGhvZHMoYm9vbGVhbiB4amNTeW5jTWV0aG9kcykgewotICAgICAgICBtb2RlbC5zZXRYamNTeW5jTWV0aG9kcyh4amNTeW5jTWV0aG9kcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTWFya0dlbmVyYXRlZChib29sZWFuIHhqY01hcmtHZW5lcmF0ZWQpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjTWFya0dlbmVyYXRlZCh4amNNYXJrR2VuZXJhdGVkKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlZE5hbWVzcGFjZXMoTWFwIHZhbHVlKSB7Ci0gICAgICAgIG1vZGVsLnNldEluY2x1ZGVkTmFtZXNwYWNlcyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmluZGluZ0ZpbGVzKExpc3Q8U3RyaW5nPiBiaW5kaW5nRmlsZXMpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgcGF0aCA6IGJpbmRpbmdGaWxlcykgewotICAgICAgICAgICAgbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCkuYWRkKHBhdGgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiNDgwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LldTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogTG9hZHMgdGhlIDxjb2RlPldTREwySmF2YURhdGFNb2RlbDwvY29kZT4gd2l0aCB0aGUgcGVyc2lzdGVkIGRlZmF1bHRzCi0gKiBmcm9tIHRoZSBwcmVmZXJlbmNlcyBhbmQgd2l0aCB0aGUgaW5pdGlhbCBydW50aW1lIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlCi0gKiBzdGFydGluZyBwb2ludCBXU0RMIFVSTC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBpbnB1dFVSTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZCBvYmplY3QuCi0gICAgICogQHBhcmFtIG1vZGVsIHRoZSA8Y29kZT5XU0RMMkphdmFEYXRhTW9kZWw8L2NvZGU+IHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbgotICAgICAqICAgICAgICAgICAgICBiZXR3ZWVuIGNvbW1hbmRzLgotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGlucHV0VVJMKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgICAgICB0aGlzLmlucHV0VVJMID0gaW5wdXRVUkw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLSAgICAgICAgbW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkpOwotICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVR5cGUoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFByb2plY3ROYW1lKHByb2plY3ROYW1lKTsKLQotICAgICAgICBtb2RlbC5zZXRJbmNsdWRlZE5hbWVzcGFjZXMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICBtb2RlbC5zZXRFeGNsdWRlZE5hbWVzcGFjZXMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotCi0gICAgICAgIC8vIFhKQwotICAgICAgICBtb2RlbC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKGNvbnRleHQuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZyhjb250ZXh0LmlzWGpjVG9TdHJpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGNvbnRleHQuaXNYamNUb1N0cmluZ011bHRpTGluZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdTaW1wbGUoY29udGV4dC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNMb2NhdG9yKGNvbnRleHQuaXNYamNMb2NhdG9yKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNTeW5jTWV0aG9kcyhjb250ZXh0LmlzWGpjU3luY01ldGhvZHMoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY01hcmtHZW5lcmF0ZWQoY29udGV4dC5pc1hqY01hcmtHZW5lcmF0ZWQoKSk7Ci0KLSAgICAgICAgbW9kZWwuc2V0VmFsaWRhdGUoY29udGV4dC5pc1ZhbGlkYXRlKCkpOwotICAgICAgICBtb2RlbC5zZXRQcm9jZXNzU09BUEhlYWRlcnMoY29udGV4dC5pc1Byb2Nlc3NTT0FQSGVhZGVycygpKTsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoY29udGV4dC5pc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhjb250ZXh0LmlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldFVzZURlZmF1bHRWYWx1ZXMoY29udGV4dC5pc1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIG1vZGVsLnNldE5vQWRkcmVzc0JpbmRpbmcoY29udGV4dC5pc05vQWRkcmVzc0JpbmRpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldEF1dG9OYW1lUmVzb2x1dGlvbihjb250ZXh0LmlzQXV0b05hbWVSZXNvbHV0aW9uKCkpOwotCi0gICAgICAgIG1vZGVsLnNldEphdmFTb3VyY2VGb2xkZXIoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKG1vZGVsLmdldFByb2plY3ROYW1lKCkpLnRvT1NTdHJpbmcoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gbmV3IFVSTChpbnB1dFVSTCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsVVJMKHdzZGxVcmwpOwotCi0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMVXRpbHMucmVhZFdTREwobW9kZWwuZ2V0V3NkbFVSTCgpKTsKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkucHV0KHRhcmdldE5hbWVzcGFjZSwgcGFja2FnZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFdTRExVdGlscy5nZXRXU0RMTG9jYXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBtdXJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDJKYXZhRGF0YU1vZGVsIGdldFdTREwySmF2YURhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvbG9jYXRvci9DWEZXZWJTZXJ2aWNlTG9jYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9sb2NhdG9yL0NYRldlYlNlcnZpY2VMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTBkZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9sb2NhdG9yL0NYRldlYlNlcnZpY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUubG9jYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzZmluZGVyLkFic3RyYWN0V2ViU2VydmljZUxvY2F0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGV2ViU2VydmljZUxvY2F0b3IgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yIHsKLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VDbGllbnRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0V2ViU2VydmljZUNsaWVudHMobW9uaXRvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIExpc3QgZ2V0V2ViU2VydmljZUNsaWVudHMoSVByb2plY3RbXSBwcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRXZWJTZXJ2aWNlQ2xpZW50cyhwcm9qZWN0cywgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIExpc3QgZ2V0V2ViU2VydmljZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgICAgIHJldHVybiBnZXRXZWJTZXJ2aWNlcyhwcm9qZWN0cywgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIExpc3QgZ2V0V2ViU2VydmljZXMoSVByb2plY3RbXSBwcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIExpc3Qgd2ViU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKSB7Ci0gICAgICAgICAgICBpZiAoSjJFRVV0aWxzLmlzV2ViQ29tcG9uZW50KHByb2plY3QpKSB7Ci0gICAgICAgICAgICAgICAgd2ViU2VydmljZXMuYWRkQWxsKGdldFdlYlNlcnZpY2VzRnJvbVByb2plY3QocHJvamVjdCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlczsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIExpc3QgZ2V0V2ViU2VydmljZXNGcm9tUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMWQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODcyMWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzU4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI0ZyaSBOb3YgMDcgMjM6NTg6NTMgRVNUIDIwMDgKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzIxNTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS5DWEZDb25zdW1wdGlvblVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud3NydDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuMy40IiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iMC40LjMiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWk7YnVuZGxlLXZlcnNpb249IjAuMy41IiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMS43LjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1DcmVhdGVkLUJ5OiAxLjUuMF8xNC1iMDMgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGI4ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZGU4OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBDb25zdW1wdGlvbiBVSSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUpBWFdTX1dFQlNFUlZJQ0VUWVBFPVBPSk8gV2ViIFNlcnZpY2UKLQotSkFYV1NfQ0xJRU5UPUpBWC1XUyBTdHViClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5ODFhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud3NJbXBsIj4KLSAgICAgICAgPHdlYlNlcnZpY2VJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi53c0ltcGwuamF2YSIKLSAgICAgICAgICAgIGxhYmVsPSIlSkFYV1NfV0VCU0VSVklDRVRZUEUiCi0gICAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YT0iRmlsZSBJUmVzb3VyY2UgQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyIKLSAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5DWEZKQVhXU1NlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIG1lcmdlckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkphdmFNZXJnZXIiPgotICAgICAgICA8L3dlYlNlcnZpY2VJbXBsPgotICAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAgPCEtLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c0NsaWVudEltcGwiPgotICAgICAgPHdlYlNlcnZpY2VDbGllbnRJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgbGFiZWw9IiVKQVhXU19DTElFTlQiPgotICAgICAgPC93ZWJTZXJ2aWNlQ2xpZW50SW1wbD4KLSAgICA8L2V4dGVuc2lvbj4tLT4KLSAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5vYmplY3RTZWxlY3Rpb25XaWRnZXQiPgotICAgICAgICA8b2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgICAgICAgICBjbGFzcz0iIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUiCi0gICAgICAgICAgICBleHRlcm5hbF9tb2RpZnk9InRydWUiCi0gICAgICAgICAgICBpZD0iIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuQ1hGSkFYV1NTZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICB0cmFuc2Zvcm1lcj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5KQVhXU1NlbGVjdGlvblRyYW5zZm9ybWVyIj4KLSAgICAgICAgPC9vYmplY3RTZWxlY3Rpb25XaWRnZXQ+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgaWQ9IldTREwySmF2YUNsaWVudENvbmZpZyIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIj4KLSAgICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICAgPCEtLSBXU0RMMkphdmEgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmFudERhdGFNYXBwaW5nIj4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJNYXBwaW5ncyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJJbmNsdWRlZE5hbWVzcGFjZXMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuZW52LmFudC5NYXBwaW5nc1RyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iQmluZGluZ3MiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iQmluZGluZ0ZpbGVzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmVudi5hbnQuQmluZGluZ3NUcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkphdmFPdXRwdXQiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iSmF2YVNvdXJjZUZvbGRlciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IlNlcnZpY2VOYW1lIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlNlcnZpY2VOYW1lIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuQ2xpZW50IgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlQ2xpZW50IgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuU2VydmVyIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlU2VydmVyIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuSW1wbCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZUltcGxlbWVudGF0aW9uIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRGVmYXVsdFZhbHVlcyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJVc2VEZWZhdWx0VmFsdWVzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRXh0U09BUEhlYWRlcnMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iUHJvY2Vzc1NPQVBIZWFkZXJzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRGVmYXVsdE5hbWVzcGFjZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkRlZmF1bHRFeGNsdWRlc05hbWVzcGFjZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkF1dG9OYW1lUmVzb2x1dGlvbiIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJBdXRvTmFtZVJlc29sdXRpb24iCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfZHYiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVXNlRGVmYXVsdFZhbHVlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY190cyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNUb1N0cmluZyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY190c19tdWx0aSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNUb1N0cmluZ011bHRpTGluZSIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY190c19zaW1wbGUiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVG9TdHJpbmdTaW1wbGUiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfbG9jYXRvciIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNMb2NhdG9yIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX3N5bmNfbWV0aG9kcyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNTeW5jTWV0aG9kcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY19tYXJrX2dlbmVyYXRlZCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNNYXJrR2VuZXJhdGVkIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0gIDwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4NDdiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZKQVhXU1NFTEVDVElPTkxBVU5DSEFCTEVfU0VMRUNUSU9OX0RJQUxPR19NRVNTQUdFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9DTElFTlRfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQ0xJRU5UX1BBR0VfREVTQ1JJUFRJT047Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0NsSUVOVF9ERUZBVUxUU19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9DTElFTlRfREVGQVVMVFNfUEFHRV9ERVNDUklQVElPTjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfTEFCRUw7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVORExFX05BTUUsIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDA2YjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1DWEZKQVhXU1NFTEVDVElPTkxBVU5DSEFCTEVfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1Ccm93c2UgV29ya3NwYWNlIENsYXNzZXMgYW5kIEludGVyZmFjZXMKLUNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX01FU1NBR0U9U2VsZWN0IHRoZSBKYXZhIENsYXNzIG9yIEludGVyZmFjZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBXZWIgU2VydmljZQotCi0jV1NETDJKYXZhIENsaWVudCBDb25naWggV2lkZ2V0IEZhY3RvcnkKLVdTREwySkFWQV9DTElFTlRfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIFdTREwySmF2YSBDbGllbnQgQ29uZmlndXJhdGlvbgotV1NETDJKQVZBX0NMSUVOVF9QQUdFX0RFU0NSSVBUSU9OPUN1c3RvbWlzZSB5b3VyIFdlYiBTZXJ2aWNlIGdlbmVyYXRpb24gYnkgc2VsZWN0aW5nIG9wdGlvbnMgb24gdGhpcyBwYWdlCi0KLVdTREwySkFWQV9DbElFTlRfREVGQVVMVFNfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIFdTREwySmF2YSBDbGllbnQgQ29uZmlndXJhdGlvbgotV1NETDJKQVZBX0NMSUVOVF9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OPUN1c3RvbWlzZSB5b3VyIFdlYiBTZXJ2aWNlIGdlbmVyYXRpb24gYnkgc2VsZWN0aW5nIG9wdGlvbnMgb24gdGhpcyBwYWdlCi0KLSNXU0RMMkphdmEgQ2xpZW50IERlZmF1bHRzIENvbmZpZyBXaWRnZXQKLVdTREwySkFWQV9HUk9VUF9MQUJFTD1XU0RMMkphdmEgR2VuZXJhdGlvbiBPcHRpb25zCi1XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTD1YSkMgQXJndW1lbnRzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OWI1ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZDb25zdW1wdGlvblVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4gcGx1Z2luOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4oKSB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICBleGNlcHRpb24udG9TdHJpbmcoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ1hGSkFYV1NTZWxlY3Rpb25MYXVuY2hhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzZDFkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkFic3RyYWN0T2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRkpBWFdTU2VsZWN0aW9uTGF1bmNoYWJsZSBleHRlbmRzIEFic3RyYWN0T2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRpb25TdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIAotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJDb21wb25lbnROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZSA9ICIiOwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikgewotICAgICAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmICFpbml0aWFsU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9IGluaXRpYWxTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gZmlyc3RFbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGxhdW5jaChTaGVsbCBzaGVsbCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhzaGVsbCwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCksIG5ldyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nCi0gICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UoQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX01FU1NBR0UpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0QWxsb3dNdWx0aXBsZShmYWxzZSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRJbnB1dChKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuYWRkRmlsdGVyKG5ldyBKYXZhVmlld2VyRmlsdGVyKCkpOwotCi0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRWYWxpZGF0b3IobmV3IEphdmFTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSk7Ci0KLSAgICAgICAgaW50IHJldHVybkNvZGUgPSBzZWxlY3Rpb25EaWFsb2cub3BlbigpOwotICAgICAgICBpZiAocmV0dXJuQ29kZSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc2VsZWN0ZWRDb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgc2VsZWN0aW9uRGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gc2VsZWN0ZWRDb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgdHlwZVJlc291cmNlID0gdHlwZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZVJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0ID0gdHlwZVJlc291cmNlLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IFJlc291cmNlVXRpbHMuZ2V0Q29tcG9uZW50T2YodHlwZVJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZSA9IGNvbXAuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRTZXZlcml0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElTdGF0dXMuQ0FOQ0VMOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZlckNvbXBvbmVudE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgICAgICBJU2VsZWN0aW9uU2VydmljZSBzZWxlY3Rpb25TZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgVHJlZVNlbGVjdGlvbiB0cmVlU2VsZWN0aW9uID0gKFRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RFbGVtZW50ID0gdHJlZVNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSBjb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdGF0dXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRPYmplY3RTZWxlY3Rpb25EaXNwbGF5YWJsZVN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgc3RyaW5nVG9WYWxpZGF0ZSkgewotICAgICAgICBjbGFzc05hbWUgPSBzdHJpbmdUb1ZhbGlkYXRlOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShwcm9qZWN0LmdldE5hbWUoKSwgY2xhc3NOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShjbGFzc05hbWUpOwotICAgICAgICB9Ci0KLS8vICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotLy8gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgSVR5cGUgdHlwZSA9IEpEVFV0aWxzLmdldFR5cGUocHJvamVjdCwgY2xhc3NOYW1lKTsKLS8vICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCAhdHlwZS5leGlzdHMoKSkgewotLy8gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLS8vICAgICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShwcm9qZWN0LmdldE5hbWUoKSwgY2xhc3NOYW1lKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0YXR1cy5pc09LKCk7Ci0vLyAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0YXR1cy5pc09LKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEphdmFWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50Lmhhc0NoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gY29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0NsYXNzKCkgfHwgdHlwZS5pc0ludGVyZmFjZSgpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF2YVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgewotICAgICAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkMDljNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLldTREwySmF2YVdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlcjsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBuYW1lc3BhY2VDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0ID0gLTE7Ci0KLSAgICBwdWJsaWMgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICB0aGlzLnN0YXR1c0xpc3RlbmVyID0gc3RhdHVzTGlzdGVuZXI7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIG1haW5Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gT3V0cHV0IERpcgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU91dHB1dERpcmVjdG9yeUxhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIENvbWJvIG91dHB1dERpckNvbWJvID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVPdXRwdXREaXJlY3RvcnlDb21ibyhtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIG91dHB1dERpckNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIFBhY2thZ2UgTmFtZToKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZUxhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIGZpbmFsIFRleHQgcGFja2FnZU5hbWVUZXh0ID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZVRleHQobWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBwYWNrYWdlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSkRUVXRpbHMudmFsaWRhdGVQYWNrYWdlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGZpbmFsIEJ1dHRvbiBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbihtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VDb21wb3NpdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA3OwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnBhY2soKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gZ2V0TmFtZXNwYWNlTWFwcGluZ0NvbXBvc2l0ZShuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IGdyb3VwU2l6ZSA9IG5hbWVzcGFjZUNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9IGdyb3VwU2l6ZS55OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLnNldFNpemUoc2hlbGxTaXplLngsIHNoZWxsU2l6ZS55ICsgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLmxheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIucGFjaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIubGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgc2hlbGxTaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwuc2V0U2l6ZShzaGVsbFNpemUueCwgc2hlbGxTaXplLnkgLSBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIFNlcnZpY2UgTmFtZToKLS8vICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlcnZpY2VOYW1lTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0vLwotLy8gICAgICAgIENvbWJvIHNlcnZpY2VOYW1lQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlcnZpY2VOYW1lQ29tYm8obWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotLy8gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotLy8gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLS8vICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIGJpbmRpbmdGaWxlc0xhYmVsID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVCaW5kaW5nRmlsZXNMYWJlbChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBiaW5kaW5nRmlsZXNMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMaXN0IGJpbmRpbmdGaWxlc0xpc3QgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUJpbmRpbmdGaWxlc0xpc3QobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEJ1dHRvbiBhZGRCaW5kaW5nRmlsZUJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQWRkQmluZGluZ0ZpbGVCdXR0b24obWFpbkNvbXBvc2l0ZSwgbW9kZWwsCi0gICAgICAgICAgICAgICAgYmluZGluZ0ZpbGVzTGlzdCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYWRkQmluZGluZ0ZpbGVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVSZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbihtYWluQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgIG1vZGVsLCBiaW5kaW5nRmlsZXNMaXN0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICAvKgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBUZXh0IHhtbENhdGFsb2dUZXh0ID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYTUxDYXRhbG9nVGV4dChtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4bWxDYXRhbG9nVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dCcm93c2VCdXR0b24obWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgICAqLwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFibGUgY3JlYXRlTmFtZXNwYWNlTWFwcGluZ1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVGFibGVWaWV3ZXIgcGFja2FnZU5hbWVUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIKLSAgICAgICAgICAgICAgICB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLSAgICAgICAgZmluYWwgVGFibGUgcGFja2FnZU5hbWVUYWJsZSA9IHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVXU0RMTmFtZXNwYWNlVmlld2VyQ29sdW1uKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIpOwotCi0gICAgICAgIENvbHVtbldlaWdodERhdGEgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBUYWJsZVZpZXdlckNvbHVtbiBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVDb2x1bW4oCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlciwgbW9kZWwpOwotCi0gICAgICAgIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKSk7Ci0gICAgICAgIHRleHRDZWxsRWRpdG9yLmFkZExpc3RlbmVyKCBuZXcgSUNlbGxFZGl0b3JMaXN0ZW5lcigpIHsKLQkJCi0JCQlwdWJsaWMgdm9pZCBlZGl0b3JWYWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWxpZFN0YXRlLCBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLQkJCQlzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsJCQkJCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgY2FuY2VsRWRpdG9yKCkgewotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGFwcGx5RWRpdG9yVmFsdWUoKSB7Ci0JCQl9Ci0JCX0pOwotICAgICAgICAKLSAgICAgICAgdGV4dENlbGxFZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQkJCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHBhY2thZ2VOYW1lKSB7Ci0JICAgICAgICAgICAgc3RhdHVzID0gSkRUVXRpbHMudmFsaWRhdGVQYWNrYWdlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBwYWNrYWdlTmFtZS50b1N0cmluZygpKTsKLQkgICAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSykgewotCSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCi0gICAgICAgIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBQYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0KHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIsCi0gICAgICAgIAkJdGV4dENlbGxFZGl0b3IsIG1vZGVsKSk7Ci0KLSAgICAgICAgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5zZXRJbnB1dChtb2RlbC5nZXRXc2RsRGVmaW5pdGlvbigpKTsKLQotICAgICAgICBUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gcGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlSXRlbXNbaV07Ci0gICAgICAgICAgICBpZiAobW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuY29udGFpbnNLZXkodGFibGVJdGVtLmdldFRleHQoMCkpKSB7Ci0gICAgICAgICAgICAgICAgdGFibGVJdGVtLnNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lVGFibGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgZ2V0TmFtZXNwYWNlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVGFibGUgcGFja2FnZU5hbWVUYWJsZSA9IGNyZWF0ZU5hbWVzcGFjZU1hcHBpbmdUYWJsZShuYW1lc3BhY2VDb21wb3NpdGUpOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICByZXR1cm4gbmFtZXNwYWNlQ29tcG9zaXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4MjhhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS5DWEZDb25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yOwotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLQotICAgIHByaXZhdGUgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0IHdzZGwySmF2YUNvbmZpZ1dpZGdldCA9IG5ldyBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQoKTsKLSAgICBwcml2YXRlIFdTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0IHdzZGwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0ID0gbmV3IFdTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0KCk7Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLSAgICAgICAgaWYgKHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldChJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgewotICAgICAgICBpZiAod2lkZ2V0Q29udHJpYnV0b3IgPT0gd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotICAgICAgICAgICAgICAgICJXU0RMMkphdmFEYXRhTW9kZWwiLCBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgd3NkbDJKYXZhQ29uZmlnV2lkZ2V0LnNldFdTREwySmF2YURhdGFNb2RlbChtb2RlbCk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0LnNldFdTREwySmF2YURhdGFNb2RlbChtb2RlbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nIHdzZGwySmF2YUNsaWVudFBhZ2VUaXRsZSA9IENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfQ0xJRU5UX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUod3NkbDJKYXZhQ2xpZW50UGFnZVRpdGxlKTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfQ0xJRU5UX1BBR0VfREVTQ1JJUFRJT04pOwotICAgICAgICB3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB3c2RsMkphdmFDb25maWdXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgU3RyaW5nIHdzZGwySmF2YUNsaWVudERlZmF1bHRzUGFnZVRpdGxlID0gQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9DbElFTlRfREVGQVVMVFNfUEFHRV9USVRMRSwgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh3c2RsMkphdmFDbGllbnREZWZhdWx0c1BhZ2VUaXRsZSk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfQ0xJRU5UX0RFRkFVTFRTX1BBR0VfREVTQ1JJUFRJT04pOwotICAgICAgICB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdzZGwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzQ5ZjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5XU0RMMkphdmFXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLQotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHVibGljIFdTREwySmF2YUNsaWVudERlZmF1bHRzQ29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHdzZGwyamF2YUdyb3VwID0gbmV3IEdyb3VwKG1haW5Db21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRUZXh0KENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGwyamF2YWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXQod3NkbDJqYXZhbGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGVmYXVsdFZhbHVlc0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTm9BZGRyZXNzQmluZGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgR3JvdXAgeGpjQXJnR3JvdXAgPSBuZXcgR3JvdXAobWFpbkNvbXBvc2l0ZSwgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldFRleHQoQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB4amNBcmdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0KHhqY0FyZ0xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJsZSB4amNBcmdzVGFibGUgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0FyZ1RhYmxlKHhqY0FyZ0dyb3VwLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0pBWFdTU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KQVhXU1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTdlNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0pBWFdTU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS5DWEZDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSkFYV1NTZWxlY3Rpb25UcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyIHsKLQotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmFsdWU7Ci0gICAgICAgICAgICBPYmplY3Qgc2VsZWN0aW9uID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRKYXZhTmFtZSA9IHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhTmFtZShmaWxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZnVsbHlRdWFsaWZpZWRKYXZhTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKElDb21waWxhdGlvblVuaXQpIHNlbGVjdGlvbikuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotICAgICAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUgPSB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmdWxseVF1YWxpZmllZEphdmFOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0cnVjdHVyZWRTZWxlY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoSUZpbGUgcmVzb3VyY2UpIHsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQotICAgICAgICBJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQotICAgICAgICBpZiAocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGphdmFGaWxlTmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLQotICAgICAgICBpZiAocGF0aC5pc0Fic29sdXRlKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSVBhdGggamF2YUZvbGRlclBhdGggPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KS5maW5kUGFja2FnZUZyYWdtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUZvbGRlclBhdGgpOwotICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSArICIuIiArIGphdmFGaWxlTmFtZTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGphdmFGaWxlTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlQ2xpZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MDg2YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOiAKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUNsaWVudEluZm87Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGV2ViU2VydmljZUNsaWVudCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZUNsaWVudCB7Ci0KLSAgICBwdWJsaWMgQ1hGV2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKSB7Ci0gICAgICAgIHN1cGVyKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsCi0gICAgICAgICAgICBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRlcGxveShJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgZWFyUHJvamVjdCkgewotCi0gICAgICAgIFZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICBXU0RMMkphdmFEYXRhTW9kZWwgd3NkbDJKYXZhTW9kZWwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMMkphdmFEYXRhTW9kZWwoKTsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZCh3c2RsMkphdmFNb2RlbCwgcHJvamVjdE5hbWUsIAotICAgICAgICAJCWdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0V3NkbFVSTCgpKSk7Ci0gICAgICAgIGNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhQ2xpZW50Q29tbWFuZCh3c2RsMkphdmFNb2RlbCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgcnVuKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LAotICAgICAgICAgICAgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjFkMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkZDFlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGU4ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1NCBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmI4ZmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZQotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNC4zIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMi4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA1LDEuMS4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQ3JlYXRlZC1CeTogMS41LjBfMTQtYjAzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmE3MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q4YzgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBDcmVhdGlvbiBDb3JlIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4Yzk2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QUk9KRUNUX1NFTEVDVElPTl9FUlJPUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfVkFMSURfUE9SVFRZUEVfTUVTU0FHRTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFUlZJQ0VfSU1QTF9OT1RfRk9VTkQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRVJWSUNFX0lNUExfTk9UX0JJTkFSWTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhYzExMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOiAKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVdTREwySkFWQV9QUk9KRUNUX1NFTEVDVElPTl9FUlJPUj1BIHBvc3NpYmxlIGNvbmZsaWN0IGhhcyBiZWVuIGRldGVjdGVkIGJldHdlZW4gcHJvamVjdCBzZWxlY3Rpb25zLlxuXG4gVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB3aWxsIHJlc3VsdCBpbiBjb2RlIGJlaW5nIGdlbmVyYXRlZCBpbnRvIHRoZSAiezB9IiBwcm9qZWN0LlxuXG5UbyBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gY2xpY2sgQ2FuY2VsIGFuZCB0aGVuIHNlbGVjdCB0aGUgIlNlcnZpY2UgcHJvamVjdDoiIGxpbmsgaW4gdGhlICJDb25maWd1cmF0aW9uOiIgc2VjdGlvbiBpbiB0aGUgV2ViIFNlcnZpY2Ugd2l6YXJkLlxuXG5DbGljayBPayB0byBjb250aW51ZSB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0KLVdTREwySkFWQV9WQUxJRF9QT1JUVFlQRV9NRVNTQUdFPVRoZSBXU0RMIGRvY3VtZW50IG11c3QgaGF2ZSBhIHZhbGlkIHBvcnRUeXBlIGVsZW1lbnQKLQotSkFWQTJXU19TRVJWSUNFX0lNUExfTk9UX0ZPVU5EPVRoZSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uICJ7MH0iIGNhbm5vdCBiZSBsb2FkZWQgZnJvbSB0aGUgInsxfSIgcHJvamVjdC4gUGxlYXNlIGNoZWNrIHRoYXQgdGhlIHByb2plY3QgY29udGFpbnMgdGhlIGNsYXNzIGFuZCB0aGF0IGl0IGlzIHZpc2libGUgb24gdGhlIHByb2plY3RzICJKYXZhIEJ1aWxkIFBhdGgiLgotSkFWQTJXU19TRVJWSUNFX0lNUExfTk9UX0JJTkFSWT1CaW5hcnkgY2xhc3MgZmlsZXMgbm90IHN1cHBvcnRlZC4gVGhlIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gbXVzdCBiZSBhIEphdmEgU291cmNlIHR5cGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzllNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkNyZWF0aW9uQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0gICAgLy8gVGhlIHBsdWctaW4gSUQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRkNyZWF0aW9uQ29yZVBsdWdpbiBwbHVnaW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luKCkgewotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENYRkNyZWF0aW9uQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9DWEZEZXBsb3lDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0NYRkRlcGxveUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5MTgxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0NYRkRlcGxveUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5TcHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRkRlcGxveUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9TRVJWTEVUID0gIm9yZy5hcGFjaGUuY3hmLnRyYW5zcG9ydC5zZXJ2bGV0LkNYRlNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgSVdlYlNlcnZpY2Ugd2ViU2VydmljZTsKLSAgICBwcml2YXRlIENYRkRhdGFNb2RlbCBtb2RlbDsKLSAgICAKLSAgICBwdWJsaWMgQ1hGRGVwbG95Q29tbWFuZChTdHJpbmcgcHJvamVjdE5hbWUsIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICB0aGlzLndlYlNlcnZpY2UgPSB3ZWJTZXJ2aWNlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdlYlNlcnZpY2VJbmZvIHdlYlNlcnZpY2VJbmZvID0gd2ViU2VydmljZS5nZXRXZWJTZXJ2aWNlSW5mbygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgc2VydmVySW5zdGFuY2VJZCA9IHdlYlNlcnZpY2VJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQgPSB3ZWJTZXJ2aWNlSW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2ZXJJbnN0YW5jZUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJbnN0YW5jZUlkKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd2ViQ29iQ29tcG9uZW50VVJMID0gU2VydmVyVXRpbHMuZ2V0RW5jb2RlZFdlYkNvbXBvbmVudFVSTChwcm9qZWN0LCBzZXJ2ZXJGYWN0b3J5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyB1cmxQYXR0ZXJuID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG1vZGVsUHJvdmlkZXIgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotICAgICAgICAgICAgICAgIC8vIGpzdC53ZWIgMi41Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVsUHJvdmlkZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIGphdmFlZVdlYkFwcCA9IAotICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxQcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHVybFBhdHRlcm4gPSBnZXRVUkxQYXR0ZXJuKGphdmFlZVdlYkFwcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGpzdC53ZWIgMi40Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVsUHJvdmlkZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIHdlYkFwcCA9IAotICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgbW9kZWxQcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHVybFBhdHRlcm4gPSBnZXRVUkxQYXR0ZXJuKHdlYkFwcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHVybFBhdHRlcm4gPSB1cmxQYXR0ZXJuLnN1YnN0cmluZygwLCB1cmxQYXR0ZXJuLmxhc3RJbmRleE9mKCIvIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgU3RyaW5nIGpheHdzRW5kcG9pbnRBZGRyZXNzID0gU3ByaW5nVXRpbHMuZ2V0RW5kcG9pbnRBZGRyZXNzKHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0Q29uZmlnSWQoKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxBZGRyZXNzID0gd2ViQ29iQ29tcG9uZW50VVJMICsgdXJsUGF0dGVybiArIGpheHdzRW5kcG9pbnRBZGRyZXNzOwotICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsVVJMID0gd3NkbEFkZHJlc3MgKyAiP3dzZGwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2ViU2VydmljZS5nZXRXZWJTZXJ2aWNlSW5mbygpLnNldFdzZGxVUkwod3NkbFVSTCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKTsKLQotICAgICAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gV1NETFV0aWxzLmdldEVuZHBvaW50QWRkcmVzcyhkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgKChTT0FQQWRkcmVzcykgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLnNldExvY2F0aW9uVVJJKHdzZGxBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFNPQVAxMkFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5zZXRMb2NhdGlvblVSSSh3c2RsQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBXU0RMVXRpbHMud3JpdGVXU0RMKG1vZGVsLmdldFdzZGxVUkwoKSwgZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpb2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VVJMUGF0dGVybihvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgamF2YWVlV2ViQXBwKSB7Ci0gICAgICAgIExpc3Q8b3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldD4gc2VydmxldHMgPSBqYXZhZWVXZWJBcHAuZ2V0U2VydmxldHMoKTsKLSAgICAgICAgZm9yIChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0IHNlcnZsZXQgOiBzZXJ2bGV0cykgewotICAgICAgICAgICAgaWYgKHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCkuZXF1YWxzKENYRl9TRVJWTEVUKSkgewotICAgICAgICAgICAgICAgIExpc3Q8b3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc+IHNlcnZsZXRNYXBwaW5ncyA9IAotICAgICAgICAgICAgICAgICAgICBqYXZhZWVXZWJBcHAuZ2V0U2VydmxldE1hcHBpbmdzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyBzZXJ2bGV0TWFwcGluZyA6IHNlcnZsZXRNYXBwaW5ncykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmxldE1hcHBpbmcuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU+IHVybFBhdHRlcm5zID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldE1hcHBpbmcuZ2V0VXJsUGF0dGVybnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmxQYXR0ZXJucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxQYXR0ZXJucy5nZXQoMCkpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIFN0cmluZyBnZXRVUkxQYXR0ZXJuKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCB3ZWJBcHApIHsKLSAgICAgICAgTGlzdDxvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0PiBzZXJ2bGV0cyA9IHdlYkFwcC5nZXRTZXJ2bGV0cygpOwotICAgICAgICBmb3IgKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQgc2VydmxldCA6IHNlcnZsZXRzKSB7Ci0gICAgICAgICAgICBpZiAoc2VydmxldC5nZXRTZXJ2bGV0Q2xhc3MoKS5nZXRKYXZhTmFtZSgpLmVxdWFscyhDWEZfU0VSVkxFVCkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nPiBzZXJ2bGV0TWFwcGluZ3MgPSAKLSAgICAgICAgICAgICAgICAgICAgd2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpOwotICAgICAgICAgICAgICAgIGZvciAob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmcgc2VydmxldE1hcHBpbmcgOiBzZXJ2bGV0TWFwcGluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZsZXRNYXBwaW5nLmdldFNlcnZsZXQoKS5nZXRTZXJ2bGV0TmFtZSgpLmVxdWFscyhzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmxldE1hcHBpbmcuZ2V0VXJsUGF0dGVybigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDWEZEYXRhTW9kZWwoQ1hGRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRDb21wb25lbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gInRlbXBsYXRlLmN4Zi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0pBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWUwNWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5JVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LkFudEVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZDaGFuZ2VzID0gMDsKLQotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIElUeXBlIGphdmFDbGFzc1R5cGU7Ci0gICAgcHJpdmF0ZSBJVHlwZSBqYXZhSW50ZXJmYWNlVHlwZTsKLQotICAgIHB1YmxpYyBKQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgaWYgKGdldEVudmlyb25tZW50KCkgaW5zdGFuY2VvZiBBbnRFbnZpcm9ubWVudCkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0ZUludGVyZmFjZShtb25pdG9yKTsKLQotICAgICAgICAgICAgICAgIGlmIChtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRlU0VJQ2xhc3MobW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGVDbGFzcyhtb25pdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGl0ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFubm90YXRlSW50ZXJmYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBqYXZhSW50ZXJmYWNlVHlwZSA9IEpEVFV0aWxzLmdldFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSk7Ci0KLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpbmcgSW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAoSUZpbGUpamF2YUludGVyZmFjZVR5cGUuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJTZXJ2aWNlQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICBJTWV0aG9kW10gdHlwZU1ldGhvZHMgPSBKRFRVdGlscy5nZXRQdWJsaWNNZXRob2RzKGphdmFJbnRlcmZhY2VUeXBlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSB0eXBlTWV0aG9kc1tpXTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQobWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwID09IG51bGwgfHwgbWV0aG9kQW5ub3RhdGlvbk1hcC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCkpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYk1ldGhvZEFubm90YXRpb25DaGFuZ2UoamF2YUludGVyZmFjZVR5cGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFJlc3BvbnNlV3JhcHBlckFubm90YXRpb25DaGFuZ2UoamF2YUludGVyZmFjZVR5cGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLldFQl9QQVJBTSkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlBhcmFtQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTG9jYWxWYXJpYWJsZSkgcGFyYW1ldGVyLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKSwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0SW1wb3J0c0NoYW5nZShqYXZhSW50ZXJmYWNlVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbW9kZWwsCi0gICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UsIGZhbHNlKTsKLQotICAgICAgICBleGVjdXRlQ2hhbmdlKG1vbml0b3IsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5ub3RhdGVDbGFzcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YUNsYXNzVHlwZSA9IEpEVFV0aWxzLmdldFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLQotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQW5ub3RhdGluZyBDbGFzcyIsCi0gICAgICAgICAgICAgICAgKElGaWxlKSBqYXZhQ2xhc3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB0ZXh0RmlsZUNoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotCi0gICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViU2VydmljZUFubm90YXRpb25DaGFuZ2UoamF2YUNsYXNzVHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICBJTWV0aG9kW10gdHlwZU1ldGhvZHMgPSBKRFRVdGlscy5nZXRQdWJsaWNNZXRob2RzKGphdmFDbGFzc1R5cGUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGVNZXRob2RzW2ldOwotICAgICAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gbWV0aG9kQW5ub3RhdGlvbk1hcCA9IG1vZGVsLmdldE1ldGhvZE1hcCgpLmdldChtZXRob2QpOwotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAgPT0gbnVsbCB8fCBtZXRob2RBbm5vdGF0aW9uTWFwLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QpKSB7Ci0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJNZXRob2RBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1ldGhvZCwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKSkgewotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpKSB7Ci0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLldFQl9QQVJBTSkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlBhcmFtQW5ub3RhdGlvbkNoYW5nZShqYXZhQ2xhc3NUeXBlLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRJbXBvcnRzQ2hhbmdlKGphdmFDbGFzc1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG1vZGVsLAotICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLCBmYWxzZSk7Ci0KLSAgICAgICAgZXhlY3V0ZUNoYW5nZShtb25pdG9yLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFubm90YXRlU0VJQ2xhc3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmFDbGFzc1R5cGUgPSBKRFRVdGlscy5nZXRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgIC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSk7Ci0KLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpb24gQ2hhbmdlcyIsCi0gICAgICAgICAgICAgICAgKElGaWxlKWphdmFDbGFzc1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJTZXJ2aWNlQW5ub3RhdGlvbkNoYW5nZShqYXZhQ2xhc3NUeXBlLCBtb2RlbCwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0SW1wb3J0c0NoYW5nZShqYXZhQ2xhc3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBtb2RlbCwKLSAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSwgdHJ1ZSk7Ci0KLSAgICAgICAgZXhlY3V0ZUNoYW5nZShtb25pdG9yLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDaGFuZ2UoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCB8fCAhY2hhbmdlLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJVW5kb01hbmFnZXIgbWFuYWdlciA9IFJlZmFjdG9yaW5nQ29yZS5nZXRVbmRvTWFuYWdlcigpOwotICAgICAgICBib29sZWFuIHN1Y2Nlc3NmdWwgPSBmYWxzZTsKLSAgICAgICAgQ2hhbmdlIHVuZG9DaGFuZ2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2hhbmdlLmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShtb25pdG9yKTsKLSAgICAgICAgICAgIFJlZmFjdG9yaW5nU3RhdHVzIHZhbGlkID0gY2hhbmdlLmlzVmFsaWQobW9uaXRvcik7Ci0gICAgICAgICAgICBpZiAodmFsaWQuaXNPSygpKSB7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5hYm91dFRvUGVyZm9ybUNoYW5nZShjaGFuZ2UpOwotICAgICAgICAgICAgICAgIHVuZG9DaGFuZ2UgPSBjaGFuZ2UucGVyZm9ybShtb25pdG9yKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBudW1iZXJPZkNoYW5nZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtYW5hZ2VyLmNoYW5nZVBlcmZvcm1lZChjaGFuZ2UsIHN1Y2Nlc3NmdWwpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bmRvQ2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVuZG9DaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgbWFuYWdlci5hZGRVbmRvKHVuZG9DaGFuZ2UuZ2V0TmFtZSgpLCB1bmRvQ2hhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgSVVuZG9NYW5hZ2VyIG1hbmFnZXIgPSBSZWZhY3RvcmluZ0NvcmUuZ2V0VW5kb01hbmFnZXIoKTsKLQotICAgICAgICBpZiAobWFuYWdlci5hbnl0aGluZ1RvVW5kbygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZDaGFuZ2VzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5wZXJmb3JtVW5kbyhudWxsLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTVjNWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LkphdmEyV1NQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlcy5XZWJDb250ZW50Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNvbW1hbmRMaW5lVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuTGF1bmNoVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLlNwcmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmN4Zi50b29scy5qYXZhMndzLkphdmFUb1dTPC9jb2RlPiBvciB0aGUKLSAqIDxjb2RlPm9yZy5hcGFjaGUuY3hmLnRvb2xzLmphdmEyd3NkbC5KYXZhVG9XU0RMPC9jb2RlPiBjb21tYW5kIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbgotICogb2YgQ1hGIHVzZWQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBVkEyV1NETF9UT09MX0NMQVNTX05BTUUgPSAib3JnLmFwYWNoZS5jeGYudG9vbHMuamF2YTJ3c2RsLkphdmFUb1dTREwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfVE9PTF9DTEFTU19OQU1FID0gIm9yZy5hcGFjaGUuY3hmLnRvb2xzLmphdmEyd3MuSmF2YVRvV1MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBTdHJpbmcgQ1hGX1RPT0xfQ0xBU1NfTkFNRTsKLQotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLQotICAgIHByaXZhdGUgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgd2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotCi0gICAgcHVibGljIEphdmEyV1NDb21tYW5kKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgSVR5cGUgc3RhcnRpbmdQb2ludCA9IEpEVFV0aWxzLmdldFR5cGUocHJvamVjdE5hbWUsIG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCkpOwotICAgICAgICBqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihKRFRVdGlscwotICAgICAgICAgICAgICAgIC5nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgoc3RhcnRpbmdQb2ludCkpOwotICAgICAgICB3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyKHByb2plY3ROYW1lKTsKLQotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLSAgICAgICAgaWYgKG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9IEpBVkEyV1NfVE9PTF9DTEFTU19OQU1FOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9IEpBVkEyV1NETF9UT09MX0NMQVNTX05BTUU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwcm9nQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0SmF2YTJXU1Byb2dyYW1Bcmd1bWVudHMobW9kZWwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgICAgTGF1bmNoVXRpbHMubGF1bmNoKGphdmFQcm9qZWN0LCBDWEZfVE9PTF9DTEFTU19OQU1FLCBwcm9nQXJncyk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUoyV0ZpbGVzRnJvbVRtcChtb2RlbCk7Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKSB7Ci0gICAgICAgICAgICAgICAgU3ByaW5nVXRpbHMubG9hZFNwcmluZ0NvbmZpZ0luZm9ybWF0aW9uRnJvbVdTREwobW9kZWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNJbXBsZW1lbnRhdGlvblNlbGVjdGVkKCkgfHwgaXNHZW5lcmF0ZVNlcnZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU3ByaW5nVXRpbHMuY3JlYXRlSkFYV1NFbmRwb2ludChtb2RlbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpb2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICBGaWxlVXRpbHMucmVmcmVzaFByb2plY3QocHJvamVjdE5hbWUsIG1vbml0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbXBsZW1lbnRhdGlvblNlbGVjdGVkKCkgewotICAgICAgICByZXR1cm4gbW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgIT0gbnVsbCAmJgotICAgICAgICBtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0dlbmVyYXRlU2VydmVyKCkgewotICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKSB7Ci0gICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUobW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpICsgIkltcGwiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBMaXN0PElSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgaWYgKGNoYW5nZWRSZXNvdXJjZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUNsaWVudChjb250ZXh0LmlzR2VuZXJhdGVDbGllbnQoKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhjb250ZXh0LmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXU0RMKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgIG1vZGVsLnNldFNvYXAxMkJpbmRpbmcoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlWFNESW1wb3J0cyhjb250ZXh0LmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBDWEZEYXRhTW9kZWwgZ2V0Q1hGRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgLy9BTlQgRW52aXJvbm1lbnQgTWFwcGluZ3MKLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUNsaWVudChCb29sZWFuIGdlbmVyYXRlQ2xpZW50KSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGdlbmVyYXRlQ2xpZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlcihCb29sZWFuIGdlbmVyYXRlU2VydmVyKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGdlbmVyYXRlU2VydmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKEJvb2xlYW4gZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucykgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV1NETChCb29sZWFuIGdlbmVyYXRlV1NETCkgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdTREwoZ2VuZXJhdGVXU0RMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZU5hbWUoU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICBtb2RlbC5zZXRXc2RsRmlsZU5hbWUod3NkbEZpbGVOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVhTREltcG9ydHMoQm9vbGVhbiBnZW5lcmF0ZVhTREltcG9ydHMpIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGdlbmVyYXRlWFNESW1wb3J0cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlU09BUDEyQmluZGluZyhCb29sZWFuIHVzZVNPQVAxMkJpbmRpbmcpIHsKLSAgICAgICAgbW9kZWwuc2V0U29hcDEyQmluZGluZyh1c2VTT0FQMTJCaW5kaW5nKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjQ1OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVZlcnNpb24oY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVR5cGUoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSk7Ci0KLSAgICAgICAgICAgIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlID0gZ2V0SmF2YVN0YXJ0aW5nUG9pbnRUeXBlKCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Uoc3RhcnRpbmdQb2ludFR5cGUuaXNJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRFeHRyYWN0SW50ZXJmYWNlKGZhbHNlKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gc3RhcnRpbmdQb2ludFR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFRhcmdldE5hbWVzcGFjZShKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKTsKLQotICAgICAgICAgICAgbW9kZWwuc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKGNvbnRleHQuaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oY29udGV4dC5pc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihjb250ZXh0LmlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0QW5ub3RhdGlvbk1hcChDWEZNb2RlbFV0aWxzLmdldEFubm90YXRpb25NYXAobW9kZWwpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldE1ldGhvZE1hcChDWEZNb2RlbFV0aWxzLmdldE1ldGhvZE1hcChzdGFydGluZ1BvaW50VHlwZSwgbW9kZWwpKTsKLQotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGNvbnRleHQuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXREYXRhYmluZGluZyhjb250ZXh0LmdldERhdGFiaW5kaW5nKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0RnJvbnRlbmQoY29udGV4dC5nZXRGcm9udGVuZCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGNvbnRleHQuaXNHZW5lcmF0ZUNsaWVudCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFNvYXAxMkJpbmRpbmcoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKGNvbnRleHQuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXU0RMKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoY29udGV4dC5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFZlcmJvc2UoY29udGV4dC5pc1ZlcmJvc2UoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzc05hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsRmlsZU5hbWUoY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkgKyBXU0RMVXRpbHMuV1NETF9GSUxFX0VYVEVOU0lPTik7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGptZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBDWEZEYXRhTW9kZWwgZ2V0SmF2YTJXU0RhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBJVHlwZSBnZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBqYXZhU3RhcnRpbmdQb2ludCA9IG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCk7Ci0KLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBJVHlwZSBzdGFydGluZ1BvaW50VHlwZSA9IEpEVFV0aWxzLmdldFR5cGUoamF2YVByb2plY3QsIGphdmFTdGFydGluZ1BvaW50KTsKLSAgICAgICAgcmV0dXJuIHN0YXJ0aW5nUG9pbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKSwgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpCi0gICAgICAgIC5nZXRFbGVtZW50TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NTZWxlY3RTRUlDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NTZWxlY3RTRUlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTA5NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTU2VsZWN0U0VJQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy5zdHJ1Y3R1cmUuRXh0cmFjdEludGVyZmFjZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuYWN0aW9ucy5Xb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkphdmFQcmVmZXJlbmNlc1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS51dGlsLkJ1c3lJbmRpY2F0b3JSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hlY2tDb25kaXRpb25zT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNyZWF0ZUNoYW5nZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5QZXJmb3JtQ2hhbmdlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUHJvY2Vzc29yQmFzZWRSZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LkFudEVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHJpdmF0ZSBDaGFuZ2UgdW5kb0V4dHJhY3RJbnRlcmZhY2VDaGFuZ2U7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0KLSAgICBwcml2YXRlICBJVHlwZSBzdGFydGluZ1BvaW50VHlwZTsKLQotICAgIHB1YmxpYyBKYXZhMldTU2VsZWN0U0VJQ29tbWFuZChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBqYXZhU3RhcnRpbmdQb2ludCA9IG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCk7Ci0KLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIHN0YXJ0aW5nUG9pbnRUeXBlID0gSkRUVXRpbHMuZ2V0VHlwZShqYXZhUHJvamVjdCwgamF2YVN0YXJ0aW5nUG9pbnQpOwotCi0gICAgICAgICAgICBpZiAoc3RhcnRpbmdQb2ludFR5cGUuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoc3RhcnRpbmdQb2ludFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydGluZ1BvaW50VHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoc3RhcnRpbmdQb2ludFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpICYmIG1vZGVsLmlzRXh0cmFjdEludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2Uoc3RhcnRpbmdQb2ludFR5cGUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEludGVyZmFjZShJVHlwZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgaWYgKGdldEVudmlyb25tZW50KCkgaW5zdGFuY2VvZiBBbnRFbnZpcm9ubWVudCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBFeHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3IgPSBuZXcgRXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvcih0eXBlLAotICAgICAgICAgICAgICAgICAgICBKYXZhUHJlZmVyZW5jZXNTZXR0aW5ncy5nZXRDb2RlR2VuZXJhdGlvblNldHRpbmdzKHR5cGUuZ2V0SmF2YVByb2plY3QoKSkpOwotICAgICAgICAgICAgUmVmYWN0b3JpbmcgZXh0cmFjdEludGVyZmFjZVJlZmFjdG9yaW5nID0gbmV3IFByb2Nlc3NvckJhc2VkUmVmYWN0b3JpbmcoZXh0cmFjdEludGVyZmFjZVByb2Nlc3NvcikgewotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIFJlZmFjdG9yaW5nUHJvY2Vzc29yIGdldFByb2Nlc3NvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgICAgIGlmICh0eXBlTmFtZS5pbmRleE9mKCIuIikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZyh0eXBlTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdHlwZU5hbWUubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldFJlcGxhY2UoZmFsc2UpOwotCi0gICAgICAgICAgICBTZXQ8SU1ldGhvZD4gbWV0aG9kcyA9IG1vZGVsLmdldE1ldGhvZE1hcCgpLmtleVNldCgpOwotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRFeHRyYWN0ZWRNZW1iZXJzKG1ldGhvZHMudG9BcnJheShuZXcgSU1lbWJlclttZXRob2RzLnNpemUoKV0pKTsKLSAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3Iuc2V0QWJzdHJhY3QoZmFsc2UpOwotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRQdWJsaWModHJ1ZSk7Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldENvbW1lbnRzKGZhbHNlKTsKLSAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3Iuc2V0SW5zdGFuY2VPZihmYWxzZSk7Ci0KLSAgICAgICAgICAgIENyZWF0ZUNoYW5nZU9wZXJhdGlvbiBjcmVhdGVDaGFuZ2VPcGVyYXRpb24gPSBuZXcgQ3JlYXRlQ2hhbmdlT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICBuZXcgQ2hlY2tDb25kaXRpb25zT3BlcmF0aW9uKGV4dHJhY3RJbnRlcmZhY2VSZWZhY3RvcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0NvbmRpdGlvbnNPcGVyYXRpb24uRklOQUxfQ09ORElUSU9OUyksIFJlZmFjdG9yaW5nQ29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25kaXRpb25DaGVja2luZ0ZhaWxlZFNldmVyaXR5KCkpOwotCi0gICAgICAgICAgICBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uIHBlcmZvcm1DaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbihjcmVhdGVDaGFuZ2VPcGVyYXRpb24pOwotCi0gICAgICAgICAgICBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIocGVyZm9ybUNoYW5nZU9wZXJhdGlvbik7Ci0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCdXN5SW5kaWNhdG9yUnVubmFibGVDb250ZXh0KCksIGFkYXB0ZXIsIGFkYXB0ZXIuZ2V0U2NoZWR1bGluZ1J1bGUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChwZXJmb3JtQ2hhbmdlT3BlcmF0aW9uLmNoYW5nZUV4ZWN1dGVkKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKz0gIi4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA9IHBhY2thZ2VOYW1lICsgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5nZXRUeXBlTmFtZSgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TWV0aG9kTWFwKENYRk1vZGVsVXRpbHMuZ2V0TWV0aG9kTWFwKEpEVFV0aWxzLmdldFR5cGUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUpLCBtb2RlbCkpOwotCi0gICAgICAgICAgICAgICAgdW5kb0V4dHJhY3RJbnRlcmZhY2VDaGFuZ2UgPSBwZXJmb3JtQ2hhbmdlT3BlcmF0aW9uLmdldFVuZG9DaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhpdGUpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhpZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBpZiAodW5kb0V4dHJhY3RJbnRlcmZhY2VDaGFuZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uIGNoYW5nZU9wZXJhdGlvbiA9IG5ldyBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uKHVuZG9FeHRyYWN0SW50ZXJmYWNlQ2hhbmdlKTsKLQotICAgICAgICAgICAgICAgIFdvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlciBhZGFwdGVyPSBuZXcgV29ya2JlbmNoUnVubmFibGVBZGFwdGVyKGNoYW5nZU9wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW5JblVJKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1c3lJbmRpY2F0b3JSdW5uYWJsZUNvbnRleHQoKSwgYWRhcHRlciwgYWRhcHRlci5nZXRTY2hlZHVsaW5nUnVsZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmICghc3RhcnRpbmdQb2ludFR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkuaXNDb25zaXN0ZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmdQb2ludFR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkubWFrZUNvbnNpc3RlbnQobW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TWV0aG9kTWFwKENYRk1vZGVsVXRpbHMuZ2V0TWV0aG9kTWFwKHN0YXJ0aW5nUG9pbnRUeXBlLCBtb2RlbCkpOwotCi0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpdGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiZWVjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHVibGljIEphdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBKRFRVdGlscy5nZXRUeXBlKGphdmFQcm9qZWN0LCBtb2RlbC5nZXRKYXZhU3RhcnRpbmdQb2ludCgpKTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwgfHwgIXR5cGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuYmluZChDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5KQVZBMldTX1NFUlZJQ0VfSU1QTF9OT1RfRk9VTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSwgbW9kZWwuZ2V0UHJvamVjdE5hbWUoKX0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlLmlzQmluYXJ5KCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5KQVZBMldTX1NFUlZJQ0VfSU1QTF9OT1RfQklOQVJZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDQ0ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLkphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuV2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5Db21tYW5kTGluZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkxhdW5jaFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5TcHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jeGYudG9vbHMud3NkbHRvLldTRExUb0phdmE8L2NvZGU+IGNvbW1hbmQuCi0gKgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmN4Zi50b29scy53c2RsdG8uV1NETFRvSmF2YSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7Ci0KLSAgICBwcml2YXRlIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotICAgIHByaXZhdGUgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFDb21tYW5kKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCwgSVdlYlNlcnZpY2Ugd3MpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICB0aGlzLndzID0gd3M7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIobmV3IFBhdGgobW9kZWwuZ2V0SmF2YVNvdXJjZUZvbGRlcigpKSk7Ci0gICAgICAgIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0KLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0KLSAgICAgICAgLy9UT0RPIHJldmlzaXQKLSAgICAgICAgd3MuZ2V0V2ViU2VydmljZUluZm8oKS5zZXRJbXBsVVJMcyhuZXcgU3RyaW5nW10ge3Byb2plY3ROYW1lICsgIi9JbXBsLmphdmEifSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBTdHJpbmdbXSBwcm9nQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0V1NETDJKYXZhUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIExhdW5jaFV0aWxzLmxhdW5jaChqYXZhUHJvamVjdCwgQ1hGX1RPT0xfQ0xBU1NfTkFNRSwgcHJvZ0FyZ3MpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlXMkpGaWxlc0Zyb21UbXAobW9kZWwpOwotCi0gICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBTcHJpbmdVdGlscy5jcmVhdGVDb25maWd1cmF0aW9uRnJvbVdTREwobW9kZWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgRmlsZVV0aWxzLnJlZnJlc2hQcm9qZWN0KHByb2plY3ROYW1lLCBtb25pdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwod2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIGlmIChjaGFuZ2VkUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIENYRkRhdGFNb2RlbCBnZXRDWEZEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICAvL0FOVCBFbnZpcm9ubWVudCBNYXBwaW5ncwotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTb3VyY2VGb2xkZXIoU3RyaW5nIGphdmFTb3VyY2VGb2xkZXIpIHsKLSAgICAgICAgbW9kZWwuc2V0SmF2YVNvdXJjZUZvbGRlcihqYXZhU291cmNlRm9sZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmVyKGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXIpIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oYm9vbGVhbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHVzZURlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgbW9kZWwuc2V0VXNlRGVmYXVsdFZhbHVlcyh1c2VEZWZhdWx0VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzU09BUEhlYWRlcnMoYm9vbGVhbiBwcm9jZXNzU09BUEhlYWRlcnMpIHsKLSAgICAgICAgbW9kZWwuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKHByb2Nlc3NTT0FQSGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZykgewotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZykgewotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b05hbWVSZXNvbHV0aW9uKGJvb2xlYW4gYXV0b05hbWVSZXNvbHV0aW9uKSB7Ci0gICAgICAgIG1vZGVsLnNldEF1dG9OYW1lUmVzb2x1dGlvbihhdXRvTmFtZVJlc29sdXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1VzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB4amNVc2VEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoeGpjVXNlRGVmYXVsdFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmcoYm9vbGVhbiB4amNUb1N0cmluZykgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdTaW1wbGUoYm9vbGVhbiB4amNUb1N0cmluZ1NpbXBsZSkgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZ1NpbXBsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoYm9vbGVhbiB4amNUb1N0cmluZ011bHRpTGluZSkgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ011bHRpTGluZSh4amNUb1N0cmluZ011bHRpTGluZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTG9jYXRvcihib29sZWFuIHhqY0xvY2F0b3IpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjTG9jYXRvcih4amNMb2NhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNTeW5jTWV0aG9kcyhib29sZWFuIHhqY1N5bmNNZXRob2RzKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1N5bmNNZXRob2RzKHhqY1N5bmNNZXRob2RzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNNYXJrR2VuZXJhdGVkKGJvb2xlYW4geGpjTWFya0dlbmVyYXRlZCkgewotICAgICAgICBtb2RlbC5zZXRYamNNYXJrR2VuZXJhdGVkKHhqY01hcmtHZW5lcmF0ZWQpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVkTmFtZXNwYWNlcyhNYXAgdmFsdWUpIHsKLSAgICAgICAgbW9kZWwuc2V0SW5jbHVkZWROYW1lc3BhY2VzKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nRmlsZXMoTGlzdDxTdHJpbmc+IGJpbmRpbmdGaWxlcykgewotICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogYmluZGluZ0ZpbGVzKSB7Ci0gICAgICAgICAgICBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5hZGQocGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODI0YjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LldTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlcy5XZWJDb250ZW50Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51dGlsLldTRExDb3BpZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHJpdmF0ZSBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaW5wdXRVUkw7Ci0KLSAgICBwcml2YXRlIFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciB3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBpbnB1dFVSTCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgICAgICAgdGhpcy5pbnB1dFVSTCA9IGlucHV0VVJMOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJkZXByZWNhdGlvbiIgfSkKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgICAgIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIocHJvamVjdE5hbWUpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0gICAgICAgIFdTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0gICAgICAgIG1vZGVsLnNldERlZmF1bHRSdW50aW1lVmVyc2lvbihjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKTsKLSAgICAgICAgbW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpOwotICAgICAgICAvLwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkpOwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVNlcnZlcihjb250ZXh0LmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgIG1vZGVsLnNldERhdGFiaW5kaW5nKGNvbnRleHQuZ2V0RGF0YWJpbmRpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldEZyb250ZW5kKGNvbnRleHQuZ2V0RnJvbnRlbmQoKSk7Ci0gICAgICAgIG1vZGVsLnNldFdzZGxWZXJzaW9uKGNvbnRleHQuZ2V0V3NkbFZlcnNpb24oKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQW50QnVpbGRGaWxlKGNvbnRleHQuaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0SW5jbHVkZWROYW1lc3BhY2VzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLSAgICAgICAgbW9kZWwuc2V0RXhjbHVkZWROYW1lc3BhY2VzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLQotICAgICAgICAvLyBYSkMKLSAgICAgICAgbW9kZWwuc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhjb250ZXh0LmlzWGpjVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmcoY29udGV4dC5pc1hqY1RvU3RyaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ011bHRpTGluZShjb250ZXh0LmlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nU2ltcGxlKGNvbnRleHQuaXNYamNUb1N0cmluZ1NpbXBsZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjTG9jYXRvcihjb250ZXh0LmlzWGpjTG9jYXRvcigpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjU3luY01ldGhvZHMoY29udGV4dC5pc1hqY1N5bmNNZXRob2RzKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNNYXJrR2VuZXJhdGVkKGNvbnRleHQuaXNYamNNYXJrR2VuZXJhdGVkKCkpOwotCi0gICAgICAgIG1vZGVsLnNldFZhbGlkYXRlKGNvbnRleHQuaXNWYWxpZGF0ZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKGNvbnRleHQuaXNQcm9jZXNzU09BUEhlYWRlcnMoKSk7Ci0gICAgICAgIG1vZGVsLnNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGNvbnRleHQuaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoY29udGV4dC5pc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRVc2VEZWZhdWx0VmFsdWVzKGNvbnRleHQuaXNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICBtb2RlbC5zZXRBdXRvTmFtZVJlc29sdXRpb24oY29udGV4dC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpKTsKLSAgICAgICAgbW9kZWwuc2V0Tm9BZGRyZXNzQmluZGluZyhjb250ZXh0LmlzTm9BZGRyZXNzQmluZGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KGNvbnRleHQuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIG1vZGVsLnNldEphdmFTb3VyY2VGb2xkZXIoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKG1vZGVsLmdldFByb2plY3ROYW1lKCkpLnRvT1NTdHJpbmcoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSBuZXcgVVJMKGlucHV0VVJMKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFdzZGxVUkwod3NkbFVybCk7Ci0gICAgICAgICAgICBpZiAod3NkbFVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpZiAoIUZpbGVVdGlscy5pc0ZpbGVJbldlYkNvbnRlbnRGb2xkZXIocHJvamVjdCwgbmV3IFBhdGgod3NkbFVybC5nZXRQYXRoKCkpKSkgewotICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIHdzZGxGb2xkZXIgPSBXU0RMVXRpbHMuZ2V0V1NETEZvbGRlcihwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgSVBhdGggd3NkbEZvbGRlclBhdGggPSB3c2RsRm9sZGVyLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZVRvQ29weSA9IG5ldyBGaWxlKHdzZGxVcmwudG9VUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFdTRExDb3BpZXIgY29waWVyID0gbmV3IFdTRExDb3BpZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9mb3IgRWNsaXBzZSAzLjMgY29tcGF0aWJpbGl0eQotICAgICAgICAgICAgICAgICAgICBjb3BpZXIuc2V0U291cmNlVVJJKHdzZGxVcmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvcGllci5zZXRUYXJnZXRGb2xkZXJVUkkod3NkbEZvbGRlci5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAvL2NvcGllci5zZXRUYXJnZXRGb2xkZXJVUkkod3NkbEZvbGRlclBhdGgudG9GaWxlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZS5ydW4oY29waWVyLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgd3NkbEZvbGRlci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgd3NkbEZpbGUgPSB3c2RsRm9sZGVyUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChmaWxlVG9Db3B5LmdldE5hbWUoKSkudG9GaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxVUkwod3NkbEZpbGUudG9VUkwoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmluaXRpb24gPSBXU0RMVXRpbHMucmVhZFdTREwobW9kZWwuZ2V0V3NkbFVSTCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFROU09uTW9kZWwoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdTRExMb2NhdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiA9IFdTRExVdGlscy5yZWFkV1NETCh3c2RsVXJsKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0PE1hcC5FbnRyeT4gc2VydmljZXNTZXQgPSBzZXJ2aWNlc01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgICAgICBzZXRUTlNPbk1vZGVsKGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBzZXRXU0RMTG9jYXRpb24oZGVmaW5pdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgc2VydmljZUVudHJ5IDogc2VydmljZXNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBwb3J0c01hcCA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldDxNYXAuRW50cnk+IHBvcnRzU2V0ID0gcG9ydHNNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHBvcnRFbnRyeSA6IHBvcnRzU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gcG9ydC5nZXRCaW5kaW5nKCkuZ2V0UG9ydFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKSArIFdTRExVdGlscy5XU0RMX0ZJTEVfRVhURU5TSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElQYXRoIHdzZGxGb2xkZXJQYXRoID0gV1NETFV0aWxzLmdldFdTRExGb2xkZXIocHJvamVjdCkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBXU0RMQ29waWVyIGNvcGllciA9IG5ldyBXU0RMQ29waWVyKCk7Ci0gICAgICAgICAgICAgICAgY29waWVyLnNldFNvdXJjZVVSSSh3c2RsVXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICAgICAgICAgIGNvcGllci5zZXRUYXJnZXRGb2xkZXJVUkkod3NkbEZvbGRlclBhdGgudG9GaWxlKCkudG9VUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBjb3BpZXIuc2V0VGFyZ2V0RmlsZW5hbWUoZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHdvcmtzcGFjZS5ydW4oY29waWVyLCBtb25pdG9yKTsKLQotICAgICAgICAgICAgICAgIEZpbGUgd3NkbEZpbGUgPSB3c2RsRm9sZGVyUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChmaWxlbmFtZSkudG9GaWxlKCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbFVSTCh3c2RsRmlsZS50b1VSSSgpLnRvVVJMKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbW9kZWwuc2V0V3NkbEZpbGVOYW1lKGdldFdTRExGaWxlTmFtZUZyb21VUkwobW9kZWwuZ2V0V3NkbFVSTCgpKSk7Ci0KLSAgICAgICAgICAgIElQYXRoIHdzZGxMb2NhdGlvblBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRXc2RsVVJMKCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIHdzZGxMb2NhdGlvblBhdGggPSB3c2RsTG9jYXRpb25QYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoV1NETFV0aWxzLmdldFdlYkNvbnRlbnRGb2xkZXIocHJvamVjdCkKLSAgICAgICAgICAgICAgICAgICAgLmdldExvY2F0aW9uKCkubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHdzZGxMb2NhdGlvblBhdGgpKTsKLQotICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvblBhdGguZ2V0RGV2aWNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvblBhdGggPSB3c2RsTG9jYXRpb25QYXRoLnNldERldmljZShudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1vZGVsLnNldFdzZGxEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgICAgbW9kZWwuc2V0Q29uZmlnV3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvblBhdGgudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB1cmlzZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgdXJpc2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBtdXJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhtdXJsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKGlvZSk7Ci0gICAgICAgIH0KLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIod2ViQ29udGVudENoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExGaWxlTmFtZUZyb21VUkwoVVJMIHdzZGxVUkwpIHsKLSAgICAgICAgSVBhdGggd3NkbFBhdGggPSBuZXcgUGF0aCh3c2RsVVJMLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICByZXR1cm4gd3NkbFBhdGgubGFzdFNlZ21lbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0V1NETExvY2F0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBXU0RMVXRpbHMuZ2V0V1NETExvY2F0aW9uKGRlZmluaXRpb24pOwotICAgICAgICBpZiAod3NkbExvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1vZGVsLnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFROU09uTW9kZWwoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIG1vZGVsLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5wdXQodGFyZ2V0TmFtZXNwYWNlLCBwYWNrYWdlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFdTREwySmF2YURhdGFNb2RlbCBnZXRXU0RMMkphdmFEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBMaXN0PElSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgaWYgKGNoYW5nZWRSZXNvdXJjZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5jbGVhcigpOwotICAgICAgICBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5jbGVhcigpOwotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmEwYzQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogVGhpcyBpcyBzdG9wIGdhcCB3b3JrYXJvdW5kIGZvciBidWdzIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDMyODYiPiMyNDMyODY8L2E+Ci0gKiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzI5MCI+IzI0MzI5MDwvYT4KLSAqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHJpdmF0ZSBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBpbml0aWFsUHJvamVjdDsKLSAgICBwcml2YXRlIElQcm9qZWN0IHNlcnZlclByb2plY3Q7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBjdXJyZW50UHJvamVjdDsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRQcm9qZWN0ID09IG51bGwgJiYgaW5pdGlhbFByb2plY3QgPT0gbnVsbCAmJiBzZXJ2ZXJQcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICBtb2RlbC5zZXRQcm9qZWN0TmFtZShzZXJ2ZXJQcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRQcm9qZWN0ID09IG51bGwgJiYgaW5pdGlhbFByb2plY3QgIT0gbnVsbCAmJiAhaW5pdGlhbFByb2plY3QuZXF1YWxzKHNlcnZlclByb2plY3QpKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLldTREwySkFWQV9QUk9KRUNUX1NFTEVDVElPTl9FUlJPUiwgbmV3IE9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclByb2plY3QuZ2V0TmFtZSgpLCBpbml0aWFsUHJvamVjdC5nZXROYW1lKCl9KSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbFByb2plY3QgPT0gbnVsbCAmJiBjdXJyZW50UHJvamVjdCAhPSBudWxsICYmICFjdXJyZW50UHJvamVjdC5lcXVhbHMoc2VydmVyUHJvamVjdCkpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuV1NETDJKQVZBX1BST0pFQ1RfU0VMRUNUSU9OX0VSUk9SLCBuZXcgT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUHJvamVjdC5nZXROYW1lKCksIGN1cnJlbnRQcm9qZWN0LmdldE5hbWUoKX0pKTsKLSAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsUHJvamVjdCAhPSBudWxsICYmIGN1cnJlbnRQcm9qZWN0ICE9IG51bGwgJiYgIWN1cnJlbnRQcm9qZWN0LmVxdWFscyhzZXJ2ZXJQcm9qZWN0KSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5XU0RMMkpBVkFfUFJPSkVDVF9TRUxFQ1RJT05fRVJST1IsIG5ldyBPYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJQcm9qZWN0LmdldE5hbWUoKSwgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpfSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHNlcnZlclByb2plY3QgIT0gbnVsbCAmJiBzZXJ2ZXJQcm9qZWN0LmdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0UHJvamVjdE5hbWUoc2VydmVyUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldEVudmlyb25tZW50KCkuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LiBNYWtlIHN1cmUgdGhlICJTZXJ2aWNlIFByb2plY3QiCi0gICAgICogYW5kIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHdzZGwgZmlsZSBtYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KElQcm9qZWN0IHNlcnZlclByb2plY3QpIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqCi0gICAgICogVGhlIGluaXRpYWwgcHJvamVjdCB3aWxsIGJlIG51bGwgd2hlbiB0aGVyZSdzIG5vdGhpbmcgc2VsZWN0ZWQgaW4gdGhlIHByb2plY3QgZXhwbG9yZXIKLSAgICAgKiBUaGlzIGZvcmNlcyB0aGUgdXNlciB0byBtYWtlIGEgc2VsZWN0aW9uIHRodXMgc2V0dGluZyB0aGUgY3VycmVudCBwcm9qZWN0Ci0gICAgICogYmVsb3cuCi0gICAgICoKLSAgICAgKiBJZiB0aGVyZSB3YXMgYW4gaW5pdGlhbCBzZWxlY3Rpb24gYW5kIHRoZSB1c2VyIGNoYW5nZXMgZnJvbSBvbmUgdG9wIGRvd24gc2VydmljZQotICAgICAqIHR5cGUgdG8gYW5vdGhlciB0aGVuIHdlIGhhZCB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRoaXMuaW5pdGlhbFByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgdGhlcmUgd2FzIGFuIGluaXRpYWwgc2VsZWN0aW9uIGluIHRoZSBwcm9qZWN0IGV4cGxvcmVyIHRoZSBhYm92ZSB2YWx1ZSBpcyBzZXQgYW5kCi0gICAgICogdGhpcyBpcyBzZXQgdG8gbnVsbC4KLSAgICAgKgotICAgICAqIFRoaXMgd2lsbCBjaGFuZ2UgaG93ZXZlciBpZiB0aGUgdXNlciBtb2RpZmllcyB0aGUgdGV4dCBmaWVsZCBvciBicm93c2VzIGZvciBhCi0gICAgICogd3NkbCBmaWxlLiBVcG9uIHNlbGVjdGluZyBhIGZpbGUgaW4gYSB2YWxpZCBsb2NhdGlvbiwgdGhpcyB2YWx1ZSBnZXRzIHNldC4KLSAgICAgKiBObyBwcm9ibGVtIGluIHRoYXQgc2l0dWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLmN1cnJlbnRQcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzBjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzI1M2U3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYWRkMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI0ZyaSBOb3YgMDcgMjM6NTg6NTUgRVNUIDIwMDgKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGVhNzk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndzcnQ7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNC4zIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuMy41IiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aTtidW5kbGUtdmVyc2lvbj0iMC4zLjUiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWk7YnVuZGxlLXZlcnNpb249IjAuMy4zIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA1LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb247YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQ3JlYXRlZC1CeTogMS41LjBfMTQtYjAzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5qd3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTY5YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmMjk1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvZGlzYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0MmU3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2ZhbHNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi9mYWxzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDliMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2ZhbHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi90cnVlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi90cnVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvdHJ1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTJiNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBDcmVhdGlvbiBVSSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUNYRl9XU19SVU5USU1FX0xBQkVMPUFwYWNoZSBDWEYgMi54ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3ZTY3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5ydW50aW1lcyI+Ci0gICAgICA8cnVudGltZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jeGZXZWJTZXJ2aWNlUlQiCi0gICAgICAgIGxhYmVsPSIlQ1hGX1dTX1JVTlRJTUVfTEFCRUwiCi0gICAgICAgIHNlcnZlclJlcXVpcmVkPSJmYWxzZSIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSBkZWZpbmUgc3VwcG9ydCBmb3IgQ1hGIEpBWC1XUyBKYXZhIEZpcnN0IGFuZCBXU0RMIEZpcnN0IGluIHdlYiBwcm9qZWN0cyAtLT4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuc2VydmljZVJ1bnRpbWVzIj4KLSAgICAgIDxzZXJ2aWNlUnVudGltZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5qYXZhIiAKLSAgICAgICAgc2VydmljZUltcGxlbWVudGF0aW9uVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Qud3Mud3NJbXBsLmphdmEiCi0gICAgICAgIHJ1bnRpbWVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jeGZXZWJTZXJ2aWNlUlQiCi0gICAgICAgIGJvdHRvbVVwPSJ0cnVlIgotICAgICAgICB0b3BEb3duPSJ0cnVlIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0LkNYRldlYlNlcnZpY2VSdW50aW1lIj4KLQotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iMi40IiBhbGxvdy1uZXdlcj0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IjUuMCIgYWxsb3ctbmV3ZXI9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImN4Zi5jb3JlIiB2ZXJzaW9uPSIxLjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICA8L3NlcnZpY2VSdW50aW1lPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICAgPCEtLSBkZWZpbmUgc3VwcG9ydCBmb3IgQ1hGIEphdmEgY2xpZW50cyBpbiBXZWIgcHJvamVjdHMgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFJ1bnRpbWVzIj4KLSAgICAgICA8Y2xpZW50UnVudGltZQotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLndlYiIKLSAgICAgICAgICBjbGllbnRJbXBsZW1lbnRhdGlvblR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudC50eXBlLmphdmEiCi0gICAgICAgICAgcnVudGltZUlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmN4ZldlYlNlcnZpY2VSVCIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0LkNYRldlYlNlcnZpY2VSdW50aW1lIj4KLQotICAgICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjQiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSI1LjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImN4Zi5jb3JlIiB2ZXJzaW9uPSIxLjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgPC9jbGllbnRSdW50aW1lPgotICAgIDwvZXh0ZW5zaW9uPiAKLSAgICAKLSAgICA8IS0tIGJ1Z3MgIzI0MzI4NiAjMjQzMjkwIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25XaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJQcm9qZWN0U2VsZWN0aW9uQ29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kIi8+Ci0gICAgPC9leHRlbnNpb24+IAotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkphdmEyV1NQcmVDaGVja0NvbmZpZyIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTU2VsZWN0U0VJQ29tbWFuZCI+Ci0gICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkpBWFdTQW5ub3RhdGVDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kIj4KLSAgICAgICA8L3dpZGdldEZhY3Rvcnk+Ci0gICAgPC9leHRlbnNpb24+Ci0gCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSmF2YTJXU0NvbmZpZ1dpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkphdmEyV1NDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiPgotICAgICAgIDwvd2lkZ2V0RmFjdG9yeT4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgIDx3aWRnZXRGYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0cy5XU0RMMkphdmFDb25maWdXaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJXU0RMMkphdmFDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCI+Ci0gICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDwhLS0gSkFWQTJXUyAtLT4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYW50RGF0YU1hcHBpbmciPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlbkNsaWVudCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iR2VuZXJhdGVDbGllbnQiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5TZXJ2ZXIiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlU2VydmVyIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuV3JhcHBlckZhdWx0QmVhbnMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5XU0RMIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZVdTREwiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJXc2RsRmlsZU5hbWUiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IldzZGxGaWxlTmFtZSIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlblhTREltcG9ydHMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlWFNESW1wb3J0cyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IlVzZVNPQVAxMkJpbmRpbmciCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlVzZVNPQVAxMkJpbmRpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQotICAgIDwhLS0gV1NETDJKYXZhIC0tPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5hbnREYXRhTWFwcGluZyI+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iTWFwcGluZ3MiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iSW5jbHVkZWROYW1lc3BhY2VzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmVudi5hbnQuTWFwcGluZ3NUcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkJpbmRpbmdzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkJpbmRpbmdGaWxlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5lbnYuYW50LkJpbmRpbmdzVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJKYXZhT3V0cHV0IgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkphdmFTb3VyY2VGb2xkZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJTZXJ2aWNlTmFtZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJTZXJ2aWNlTmFtZSIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlblNlcnZlciIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZVNlcnZlciIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlbkltcGwiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkRlZmF1bHRWYWx1ZXMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iVXNlRGVmYXVsdFZhbHVlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkV4dFNPQVBIZWFkZXJzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlByb2Nlc3NTT0FQSGVhZGVycyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkRlZmF1bHROYW1lc3BhY2UiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJEZWZhdWx0RXhjbHVkZXNOYW1lc3BhY2UiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJBdXRvTmFtZVJlc29sdXRpb24iCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iQXV0b05hbWVSZXNvbHV0aW9uIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX2R2IgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1VzZURlZmF1bHRWYWx1ZXMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfdHMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVG9TdHJpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfdHNfbXVsdGkiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVG9TdHJpbmdNdWx0aUxpbmUiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfdHNfc2ltcGxlIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1RvU3RyaW5nU2ltcGxlIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX2xvY2F0b3IiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjTG9jYXRvciIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY19zeW5jX21ldGhvZHMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjU3luY01ldGhvZHMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfbWFya19nZW5lcmF0ZWQiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjTWFya0dlbmVyYXRlZCIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDNhNDQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSW1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRU5URVJfU0VJX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX0VYVFJBQ1RFRF9NRVRIT0RTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9NRVNTQUdFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9PUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9XRUJTRVJWSUNFX05BTUVfQVRUUklCVVRFX1BSRVNFTlQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19FTlRFUl9WQUxJRF9XU0RMX05BTUU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0NMQVNTX0NPTkZJR19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfQ0xBU1NfQ09ORklHX1BBR0VfREVTQ1JJUFRJT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9ERVNDUklQVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX0RFU0NSSVBUSU9OOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1BBR0VfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVEVfSkpBVkFfV0lER0VUX1BSRVZJRVc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVEVfSkpBVkFfV0lER0VUX1NFTEVDVF9NRVRIT0RfVE9fQU5OT1RBVEU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFHRV9ERVNDUklQVElPTjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUU19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HUk9VUF9MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9GT1VORDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0lNUExFTUVOVEFUSU9OX05PVF9GT1VORDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDWEZDcmVhdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNmZTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkNyZWF0aW9uVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ1hGQ3JlYXRpb25VSVBsdWdpbiBwbHVnaW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQ3JlYXRpb25VSVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZDcmVhdGlvblVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4gcGx1Zy1pbgotICAgICAqIHJlbGF0aXZlIHBhdGgKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqICAgICAgICAgICAgdGhlIHBhdGgKLSAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgZXhjZXB0aW9uLnRvU3RyaW5nKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlNDJkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSW1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI0phdmEyV1MgUHJlIENvbmZpZyBXaWRnZXQgRmFjdG9yeQotSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIEphdmEgQ2xhc3MgU3RhcnRpbmcgUG9pbnQgQ29uZmlndXJhdGlvbgotSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9ERVNDUklQVElPTj1TZWxlY3QgYW4gZXhpc3RpbmcgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgKFNFSSkgb3IgY3JlYXRlIGFuIFNFSSBieSBleHRyYWN0aW5nIGFuIGludGVyZmFjZSBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQotSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBKYXZhIEludGVyZmFjZSBTdGFydGluZyBQb2ludCBDb25maWd1cmF0aW9uCi1KQVhXU19BTk5PVEFURV9KSkFWQV9XSURHRVRfUFJFVklFVz1QcmV2aWV3OgotSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfREVTQ1JJUFRJT049U2VsZWN0IGFuIGltcGxlbWVudGF0aW9uIHRoYXQgaW1wbGVtZW50cyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIFNFSS4KLQotI0phdmEyV1MgQ29uZmlnIFdpZGdldCBGYWN0b3J5Ci1KQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBKQVgtV1MgQW5ub3RhdGlvbnMgQ29uZmlndXJhdGlvbgotSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX0RFU0NSSVBUSU9OPU9wdGlvbmFsbHksIHNlbGVjdCB0aGUgSkFYLVdTIEFubm90YXRpb25zIHRvIGFkZC4KLQotSkFWQTJXU19QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgSmF2YTJXUyBDb25maWd1cmF0aW9uCi1KQVZBMldTX1BBR0VfREVTQ1JJUFRJT049Q29uZmlndXJlIHRoZSB7MH0gSmF2YSB0byBXUyBvcHRpb25zLgotCi0jV1NETDJKYXZhIENvbmZpZyBXaWRnZXQgRmFjdG9yeQotV1NETDJKQVZBX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBXU0RMMkphdmEgQ29uZmlndXJhdGlvbgotV1NETDJKQVZBX1BBR0VfREVTQ1JJUFRJT049Q29uZmlndXJlIHRoZSB7MH0gV1NETCB0byBKYXZhIG9wdGlvbnMuCi0KLVdTREwySkFWQV9ERUZBVUxUU19QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgV1NETDJKYXZhIENvbmZpZ3VyYXRpb24KLVdTREwySkFWQV9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OPVRoZSBwYWdlIGFsbG93cyB0aGUgb3ZlcnJpZGluZyBvZiB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgdGhpcyBXZWIgU2VydmljZSBnZW5lcmF0aW9uLgotCi0jSmF2YTJXUyBDb25maWcgV2lkZ2V0Ci1KQVZBMldTX0dST1VQX0xBQkVMPUphdmEyV1MgR2VuZXJhdGlvbiBPcHRpb25zOgotCi1KQVZBMldTX0VOVEVSX1NFSV9OQU1FPVBsZWFzZSBlbnRlciB0aGUgbmFtZSBvZiB0aGUgU0VJIHRvIGV4dHJhY3QKLUpBVkEyV1NfU0VMRUNUX1NFSV9FWFRSQUNURURfTUVUSE9EUz1QbGVhc2Ugc2VsZWN0IHRoZSBtZXRob2RzIHlvdSB3aXNoIHRvIGV4dHJhY3QgZnJvbSB0aGUgezB9IGNsYXNzCi1KQVZBMldTX1NFTEVDVF9TRUlfTUVTU0FHRT1QbGVhc2Ugc2VsZWN0IGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLUpBVkEyV1NfU0VMRUNUX1NFSV9PUFRJT049UGxlYXNlIHNlbGVjdCBhbiBTRUkgb3B0aW9uCi1KQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX1RJVExFPVNlbGVjdCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19ERVNDUklQVElPTj1TZWxlY3QgdGhlIEludGVyZmFjZSB0byB1c2UgYXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi1KQVZBMldTX1NFTEVDVF9TRUlfV0VCU0VSVklDRV9OQU1FX0FUVFJJQlVURV9QUkVTRU5UPUltcGxlbWVudGF0aW9uIGNsYXNzIGNvbnRhaW5zIGFuIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gd2l0aCBhIG5hbWUgYXR0cmlidXRlIHdoaWNoIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZQotSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfVElUTEU9U2VsZWN0IGFuIEltcGxlbWVudGF0aW9uCi1KQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19ERVNDUklQVElPTj1TZWxlY3QgdGhlIEltcGxlbWVudGF0aW9uIHRvIHVzZSBmb3IgdGhlIFdlYiBTZXJ2aWNlCi0KLUpBVkEyV1NfRU5URVJfVkFMSURfV1NETF9OQU1FPVBsZWFzZSBlbnRlciBhIHZhbGlkIFdTREwgRmlsZSBuYW1lCi0KLSNXU0RMMkphdmEgRGVmYXVsdHMgQ29uZmlnIFdpZGdldAotV1NETDJKQVZBX0dST1VQX0xBQkVMPVdTREwySmF2YSBHZW5lcmF0aW9uIE9wdGlvbnMKLVdTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMPVhKQyBBcmd1bWVudHMKLUpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9TRUxFQ1RfTUVUSE9EX1RPX0FOTk9UQVRFPVNlbGVjdCB0aGUgTWV0aG9kcyB0byBhbm5vdGF0ZToKLQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5UPUltcGxlbWVudGF0aW9uIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBTRUkgbWV0aG9kICcnezB9JycKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQ9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgY2Fubm90IGJlIGZvdW5kCi1XRUJTRVJWSUNFX0lNUExFTUVOVEFUSU9OX05PVF9GT1VORD1UaGUgSW1wbGVtZW50YXRpb24gJyd7MH0nJyBjYW5ub3QgYmUgZm91bmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9zZWxlY3Rpb24vSVN0cnVjdHVyZWRTZWxlY3Rpb25Ub0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9zZWxlY3Rpb24vSVN0cnVjdHVyZWRTZWxlY3Rpb25Ub0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1NDY2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvc2VsZWN0aW9uL0lTdHJ1Y3R1cmVkU2VsZWN0aW9uVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSVN0cnVjdHVyZWRTZWxlY3Rpb25Ub0lQcm9qZWN0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmFsdWU7Ci0gICAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3ZpZXdlcnMvQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS92aWV3ZXJzL0Fubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTdmYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3ZpZXdlcnMvQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQ29sdW1uTGFiZWxQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBJbWFnZSBhZGRBbm5vdGF0aW9uSW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSByZW1vdmVBbm5vdGF0aW9uSW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSBkaXNhYmxlZDsKLQotICAgIHByaXZhdGUgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RNYXA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbktleTsKLSAgICBwcml2YXRlIElUeXBlIHR5cGU7Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIGFubm90YXRpb25LZXksIElUeXBlIHR5cGUpIHsKLSAgICAgICAgdGhpcy5tZXRob2RNYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKTsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uS2V5ID0gYW5ub3RhdGlvbktleTsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgYWRkQW5ub3RhdGlvbkltYWdlID0gQ1hGQ3JlYXRpb25VSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJpY29ucy9vYmoxNi90cnVlLmdpZiIpLmNyZWF0ZUltYWdlKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVtb3ZlQW5ub3RhdGlvbkltYWdlID0gQ1hGQ3JlYXRpb25VSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJpY29ucy9vYmoxNi9mYWxzZS5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRpc2FibGVkID0gQ1hGQ3JlYXRpb25VSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJpY29ucy9vYmoxNi9kaXNhYmxlZC5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNvdXJjZU1ldGhvZCkgewotICAgICAgICAgICAgaWYgKG1ldGhvZE1hcCA9PSBudWxsIHx8IGFubm90YXRpb25LZXkgPT0gbnVsbCB8fCB0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoU291cmNlTWV0aG9kKSBlbGVtZW50OwotCi0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbktleS5lcXVhbHMoQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gQW5ub3RhdGlvblV0aWxzLmdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgCUlMb2NhbFZhcmlhYmxlIHZhcmlhYmxlID0gKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQodmFyaWFibGUsIGFubm90YXRpb25LZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIGFubm90YXRpb25LZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobWV0aG9kTWFwLmdldChtZXRob2QpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBCb29sZWFuIGFkZEFubm90YXRpb24gPSAgbWV0aG9kTWFwLmdldChtZXRob2QpLmdldChhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkQW5ub3RhdGlvbkltYWdlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZW1vdmVBbm5vdGF0aW9uSW1hZ2U7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGFkZEFubm90YXRpb25JbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIHJlbW92ZUFubm90YXRpb25JbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIGRpc2FibGVkLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0pBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlSmF2YVdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmNlOTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0pBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5KYXZhU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LlNpbXBsZUphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuSUNvbG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5JSmF2YVBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuSmF2YVRleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLnZpZXdlcnMuQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSkFYV1NBbm5vdGF0ZUphdmFXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgIHByaXZhdGUgSVR5cGUgdHlwZTsKLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyIGphdmFUcmVlVmlld2VyOwotICAgIHByaXZhdGUgU291cmNlVmlld2VyIGFubm90YXRpb25QcmV2aWV3Vmlld2VyOwotCi0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIHdlYk1ldGhvZFZpZXdlckNvbHVtbjsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gd2ViUGFyYW1WaWV3ZXJDb2x1bW47Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uOwotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW47Ci0KLSAgICBwdWJsaWMgSkFYV1NBbm5vdGF0ZUphdmFXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICBTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5WRVJUSUNBTCB8IFNXVC5TTU9PVEgpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgc2FzaEZvcm0uc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIHNhc2hGb3JtLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIENvbXBvc2l0ZSBqYXZhVHJlZWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2FzaEZvcm0sIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXZhVHJlZWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgamF2YVRyZWVjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgb3V0bGluZUxhYmVsID0gbmV3IExhYmVsKGphdmFUcmVlY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG91dGxpbmVMYWJlbC5zZXRUZXh0KENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVhXU19BTk5PVEFURV9KSkFWQV9XSURHRVRfU0VMRUNUX01FVEhPRF9UT19BTk5PVEFURSk7Ci0KLSAgICAgICAgVHJlZSBqYXZhVHJlZSA9IG5ldyBUcmVlKGphdmFUcmVlY29tcG9zaXRlLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuSF9TQ1JPTEwpOwotICAgICAgICBqYXZhVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGphdmFUcmVlKTsKLQotICAgICAgICBqYXZhVHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gMTA7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLSAgICAgICAgamF2YVRyZWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVHJlZVZpZXdlckNvbHVtbiBjbGFzc1ZpZXdlckNvbHVtbiA9IG5ldyBUcmVlVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyLCBTV1QuTk9ORSk7Ci0gICAgICAgIFRyZWVDb2x1bW4gY2xhc3NDb2x1bW4gPSBjbGFzc1ZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgY2xhc3NDb2x1bW4uc2V0V2lkdGgoMjAwKTsKLSAgICAgICAgY2xhc3NDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOwotCi0gICAgICAgIGZpbmFsIEphdmFFbGVtZW50TGFiZWxQcm92aWRlciBqYXZhRWxlbWVudExhYmVsUHJvdmlkZXIgPSBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIGNsYXNzVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IENvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmFFbGVtZW50TGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGphdmFUcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcih0cnVlKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSVR5cGUgdHlwZSA6IHR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBJVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt0eXBlfTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSBzb3VyY2VUeXBlID0gKElUeXBlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJTWV0aG9kPiBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgSU1ldGhvZFtdIG1ldGhvZHMgPSBzb3VyY2VUeXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSkRUVXRpbHMuaXNQdWJsaWNNZXRob2QobWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljTWV0aG9kcy5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwdWJsaWNNZXRob2RzLnRvQXJyYXkobmV3IE9iamVjdFtwdWJsaWNNZXRob2RzLnNpemUoKV0pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOT19DSElMRFJFTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBqYXZhVHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSVRyZWVTZWxlY3Rpb24gdHJlZVNlbGVjdGlvbiA9IChUcmVlU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9IHRyZWVTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgZmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgPQotICAgICAgICAgICAgICAgICAgICAJbmV3IEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKGRvY3VtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIHNvdXJjZVR5cGUgPSAoSVR5cGUpIGZpcnN0RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBzb3VyY2VUeXBlLmdldEVsZW1lbnROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlZ2V4ID0gbmV3IFN0cmluZ0J1aWxkZXIoIlxcYnB1YmxpY1xcVysoPzpcXHcrXFxXKyl7MSwzfT8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlZ2lvbiByZWdpb24gPSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci5maW5kKDAsIHJlZ2V4LnRvU3RyaW5nKCksIHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5yZXZlYWxSYW5nZShyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWV0aG9kIHNvdXJjZU1ldGhvZCA9IChJTWV0aG9kKSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGUgc291cmNlVHlwZSA9IChJVHlwZSkgc291cmNlTWV0aG9kLmdldFBhcmVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gc291cmNlTWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlZ2V4ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxcYnB1YmxpYyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxXKyg/OlxcdytcXFcrKXsxLDN9PyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZChlbGVtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqP1xcKFxccyo/Lio/Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHNvdXJjZU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtdGVyTmFtZXMgPSBzb3VyY2VNZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqPyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQodHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxccyo/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZChwYXJhbXRlck5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaWYgKGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICByZWdleC5hcHBlbmQoIlxccyo/LFxccyo/Lio/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCX0KLQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqP1xcKSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAJSVJlZ2lvbiByZWdpb24gPSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci5maW5kKDAsIHJlZ2V4LnRvU3RyaW5nKCksIHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlZ2lvbiBlbGVtZW50TmFtZVJlZ2lvbiA9IGZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyLmZpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJcmVnaW9uLmdldE9mZnNldCgpLCBlbGVtZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVSZWdpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShlbGVtZW50TmFtZVJlZ2lvbi5nZXRPZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJZWxlbWVudE5hbWVSZWdpb24uZ2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIucmV2ZWFsUmFuZ2UoZWxlbWVudE5hbWVSZWdpb24uZ2V0T2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWVsZW1lbnROYW1lUmVnaW9uLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhibGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjcmVhdGVXZWJNZXRob2RWaWV3ZXJDb2x1bW4oamF2YVRyZWVWaWV3ZXIpOwotICAgICAgICBjcmVhdGVXZWJQYXJhbVZpZXdlckNvbHVtbihqYXZhVHJlZVZpZXdlcik7Ci0gICAgICAgIGNyZWF0ZVJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyKTsKLSAgICAgICAgY3JlYXRlUmVzcG9uc2VXcmFwcGVyVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyKTsKLQotICAgICAgICBqYXZhVHJlZVZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoVHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLSAgICAgICAgamF2YVRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIHByZXZpZXdDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNhc2hGb3JtLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgcHJldmlld0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgamF2YVRyZWVjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgcHJldmlld0xhYmVsID0gbmV3IExhYmVsKHByZXZpZXdDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcHJldmlld0xhYmVsLnNldFRleHQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9QUkVWSUVXKTsKLQotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlciA9IGNyZWF0ZUFubm90YXRpb25QcmV2aWV3ZXIocHJldmlld0NvbXBvc2l0ZSwgU1dULlJFQURfT05MWSB8IFNXVC5WX1NDUk9MTAotICAgICAgICAgICAgICAgIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2FzaEZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W117NTAsIDUwfSk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxpemUoKSB7Ci0gICAgICAgIHR5cGUgPSBudWxsOwotICAgICAgICB1cGRhdGVMYWJlbFByb3ZpZGVycygpOwotICAgICAgICBqYXZhVHJlZVZpZXdlci5zZXRJbnB1dChnZXRUeXBlKCkuZ2V0VHlwZVJvb3QoKSk7Ci0gICAgICAgIGphdmFUcmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgaGFuZGxlQW5ub3RhdGlvbihnZXRUeXBlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gSkRUVXRpbHMuZ2V0VHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSwgbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9SkRUVXRpbHMuZ2V0VHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSwgbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPSBKRFRVdGlscy5nZXRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgICAgICAuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2RlbC5zZXRNZXRob2RNYXAoQ1hGTW9kZWxVdGlscy5nZXRNZXRob2RNYXAodHlwZSwgbW9kZWwpKTsKLQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gY3JlYXRlV2ViTWV0aG9kVmlld2VyQ29sdW1uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotICAgICAgICB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiB3ZWJNZXRob2RDb2x1bW4gPSB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViTWV0aG9kQ29sdW1uLnNldFdpZHRoKDEwMCk7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHdlYk1ldGhvZFZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QsIGdldFR5cGUoKSkpOwotICAgICAgICB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCkpOwotICAgICAgICByZXR1cm4gd2ViTWV0aG9kVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiBjcmVhdGVXZWJQYXJhbVZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgd2ViUGFyYW1WaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiB3ZWJQYXJhbUNvbHVtbiA9IHdlYlBhcmFtVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0gICAgICAgIHdlYlBhcmFtQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLSAgICAgICAgd2ViUGFyYW1WaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0sIGdldFR5cGUoKSkpOwotICAgICAgICB3ZWJQYXJhbVZpZXdlckNvbHVtbi5zZXRFZGl0aW5nU3VwcG9ydChuZXcgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0KHRyZWVWaWV3ZXIsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKTsKLSAgICAgICAgcmV0dXJuIHdlYlBhcmFtVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiBjcmVhdGVSZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbiA9IHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKSk7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gY3JlYXRlUmVzcG9uc2VXcmFwcGVyVmlld2VyQ29sdW1uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiByZXNwb25jZVdyYXBwZXJDb2x1bW4gPSByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHJlc3BvbmNlV3JhcHBlckNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVzcG9uY2VXcmFwcGVyQ29sdW1uLnNldFdpZHRoKDEwMCk7Ci0gICAgICAgIHJlc3BvbmNlV3JhcHBlckNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHJlc3BvbmNlV3JhcHBlclZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIsIGdldFR5cGUoKSkpOwotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUikpOwotICAgICAgICByZXR1cm4gcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYWJlbFByb3ZpZGVycygpIHsKLSAgICAgICAgd2ViTWV0aG9kVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCwgZ2V0VHlwZSgpKSk7Ci0gICAgICAgIHdlYlBhcmFtVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5SRVFVRVNUX1dSQVBQRVIsIGdldFR5cGUoKSkpOwotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5SRVNQT05TRV9XUkFQUEVSLCBnZXRUeXBlKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQW5ub3RhdGlvbihJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSAgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpb24gQ2hhbmdlcyIsCi0gICAgICAgICAgICAgICAgICAgIChJRmlsZSljb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEtlZXBQcmV2aWV3RWRpdHModHJ1ZSk7Ci0KLSAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViU2VydmljZUFubm90YXRpb25DaGFuZ2UodHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgSU1ldGhvZFtdIHR5cGVNZXRob2RzID0gSkRUVXRpbHMuZ2V0UHVibGljTWV0aG9kcyh0eXBlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZU1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGVNZXRob2RzW2ldOwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfTUVUSE9EKSkgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYk1ldGhvZEFubm90YXRpb25DaGFuZ2UodHlwZSwgbWV0aG9kLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRSZXF1ZXN0V3JhcHBlckFubm90YXRpb25DaGFuZ2UodHlwZSwgbWV0aG9kLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZSh0eXBlLCBtZXRob2QsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKSkgewotCQkJCQlMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMobWV0aG9kKTsKLQkJCQkJZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLQkJCQkJCUNYRk1vZGVsVXRpbHMuZ2V0V2ViUGFyYW1Bbm5vdGF0aW9uQ2hhbmdlKHR5cGUsIG1ldGhvZCwKLQkJCQkJCQkJKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpLCB0ZXh0RmlsZUNoYW5nZSk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0SW1wb3J0c0NoYW5nZShjb21waWxhdGlvblVuaXQsIG1vZGVsLCB0ZXh0RmlsZUNoYW5nZSwgZmFsc2UpOwotICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGV4dEZpbGVDaGFuZ2UuZ2V0UHJldmlld0NvbnRlbnQobW9uaXRvcikpOwotCi0gICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBtdGUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKG10ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVBbm5vdGF0aW9uUHJldmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZXMpIHsKLSAgICAgICAgSmF2YVBsdWdpbiBqYXZhUGx1Z2luID0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBqYXZhUGx1Z2luLmdldENvbWJpbmVkUHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIEphdmFUZXh0VG9vbHMgamF2YVRleHRUb29scyA9IGphdmFQbHVnaW4uZ2V0SmF2YVRleHRUb29scygpOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlciA9IG5ldyBKYXZhU291cmNlVmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgdHJ1ZSwgc3R5bGVzLCBzdG9yZSk7Ci0gICAgICAgIElDb2xvck1hbmFnZXIgY29sb3JNYW5hZ2VyID0gamF2YVRleHRUb29scy5nZXRDb2xvck1hbmFnZXIoKTsKLSAgICAgICAgU2ltcGxlSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBTaW1wbGVKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICBjb2xvck1hbmFnZXIsIHN0b3JlLCBudWxsLCBJSmF2YVBhcnRpdGlvbnMuSkFWQV9QQVJUSVRJT05JTkcsIHRydWUpOwotCi0gICAgICAgIGFubm90YXRpb25QcmV2aWV3Vmlld2VyLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uKTsKLQotICAgICAgICBGb250IGZvbnQgPSBKRmFjZVJlc291cmNlcy5nZXRGb250KFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1RFWFRfRk9OVCk7Ci0gICAgICAgIGFubm90YXRpb25QcmV2aWV3Vmlld2VyLmdldFRleHRXaWRnZXQoKS5zZXRGb250KGZvbnQpOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQotICAgICAgICBTdHJpbmcgc291cmNlID0gZ2V0U291cmNlRnJvbVR5cGUoZ2V0VHlwZSgpKTsKLSAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KHNvdXJjZSk7Ci0KLSAgICAgICAgSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YVRleHRUb29scygpLnNldHVwSmF2YURvY3VtZW50UGFydGl0aW9uZXIoZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HKTsKLSAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uUHJldmlld1ZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUZyb21UeXBlKElUeXBlIHR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0IGV4dGVuZHMgRWRpdGluZ1N1cHBvcnQgewotICAgICAgICBwcml2YXRlIENoZWNrYm94Q2VsbEVkaXRvciBjaGVja2JveENlbGxFZGl0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbktleTsKLQotICAgICAgICBwdWJsaWMgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0KFRyZWVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgYW5ub3RhdGlvbktleSkgewotICAgICAgICAgICAgc3VwZXIodmlld2VyKTsKLSAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbktleSA9IGFubm90YXRpb25LZXk7Ci0gICAgICAgICAgICBjaGVja2JveENlbGxFZGl0b3IgPSBuZXcgQ2hlY2tib3hDZWxsRWRpdG9yKHZpZXdlci5nZXRUcmVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkVkaXQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudCh0eXBlLmZpbmRNZXRob2RzKG1ldGhvZClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hlY2tib3hDZWxsRWRpdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIEJvb2xlYW4gYW5ub3RhdGUgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQoZWxlbWVudCkuZ2V0KGFubm90YXRpb25LZXkpOwotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBhbm5vdGF0ZSA9IChCb29sZWFuKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBhbm5vdGF0aW9uTWFwID0gbW9kZWwuZ2V0TWV0aG9kTWFwKCkuZ2V0KGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFubm90YXRpb25NYXAucHV0KGFubm90YXRpb25LZXksIGFubm90YXRlKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbm5vdGF0aW9uKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotICAgICAgICAgICAgICAgIGdldFZpZXdlcigpLnJlZnJlc2godHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1MTU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciBqYXh3c0Fubm90YXRlV2lkZ2V0Q29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIEpBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0IGpheHdzQW5ub3RhdGVKYXZhV2lkZ2V0ID0gbmV3IEpBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0KCk7Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLSAgICAgICAgaWYgKGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiSmF2YTJXU0RhdGFNb2RlbCIsIEpBWFdTQW5ub3RhdGVXaWRnZXRGYWN0b3J5LmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBqYXh3c0Fubm90YXRlSmF2YVdpZGdldC5zZXRKYXZhMldTRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfVElUTEUsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2NvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGpheHdzQW5ub3RhdGVKYXZhV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ2xhc3NDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTYzYmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5KYXZhMldTV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIEpBVkFfVFlQRV9OQU1FX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBwcml2YXRlIElTdGF0dXMgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0KLSAgICBwcml2YXRlIGludCBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFM7Ci0gICAgcHJpdmF0ZSBpbnQgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUzsKLSAgICBwcml2YXRlIElNZXRob2RbXSBwdWJsaWNNZXRob2RzOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdXNlU0VJQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHNlbGVjdFNFSUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VTRUlCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZXh0cmFjdFNFSUJ1dHRvbjsKLQotICAgIHByaXZhdGUgQ29tYm8gc2VsZWN0U0VJQ29tYm87Ci0gICAgcHJpdmF0ZSBUZXh0IHNlaUludGVyZmFjZU5hbWVUZXh0OwotCi0gICAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlcjsKLSAgICBwcml2YXRlIFRhYmxlIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZTsKLSAgICBwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJVHlwZSBzdGFydGluZ1BvaW50VHlwZTsKLQotICAgIHB1YmxpYyBKYXZhMldTQ2xhc3NDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgdGhpcy5zdGFydGluZ1BvaW50VHlwZSA9IHN0YXJ0aW5nUG9pbnRUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkgewotICAgICAgICBib29sZWFuIHVzZVNFSSA9IG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0gICAgICAgIHVzZVNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlU0VJKTsKLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbih1c2VTRUkpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICBpZiAoIXVzZVNFSSkgewotICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgfQotICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyh1c2VTRUkpOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHModXNlU0VJKTsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA9IDA7Ci0gICAgICAgIHZhbGlkYXRlU0VJU2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHVzZVNFSUJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVVzZVNFSUJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICB1c2VTRUlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHVzZVNFSSA9IHVzZVNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UodXNlU0VJKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICAgICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgIGlmICghdXNlU0VJKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoIiIpOwotCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyhmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHMoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHVzZVNFSUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBwYWRkaW5nTGFiZWwgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBwYWRkaW5nTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU2VsZWN0U0VJQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKHNlbGVjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlRXh0cmFjdFNFSUNvbnRyb2xzKCFzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWxlY3RTRUlDb21ibyhjb21wb3NpdGUsIG1vZGVsLCBzdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgICAgIHNlbGVjdFNFSUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzZWxlY3RTRUlDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLSAgICAgICAgc2VsZWN0U0VJQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgYnJvd3NlU0VJQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlQnJvd3NlQnV0dG9uKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0gICAgICAgIGJyb3dzZVNFSUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBicm93c2VTRUlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFNoZWxsKCksIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX1RJVExFLAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9ESUFMT0dfREVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKSwgSUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFKTsKLQotICAgICAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gc2VsZWN0aW9uRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuQ29kZSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBzZWxlY3Rpb25EaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGVkSW50ZXJmYWNlID0gc2VsZWN0ZWRDb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzZWlzID0gQXJyYXlzLmFzTGlzdChzZWxlY3RTRUlDb21iby5nZXRJdGVtcygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWlzLmNvbnRhaW5zKHNlbGVjdGVkSW50ZXJmYWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uYWRkKHNlbGVjdGVkSW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZWxlY3RTRUlDb21iby5zZXRUZXh0KHNlbGVjdGVkSW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBhZGRpbmdMYWJlbCA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHBhZGRpbmdMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBleHRyYWN0U0VJQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRXh0cmFjdFNFSUJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBleHRyYWN0ID0gZXh0cmFjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRFeHRyYWN0SW50ZXJmYWNlKGV4dHJhY3QpOwotICAgICAgICAgICAgICAgIGVuYWJsZUV4dHJhY3RTRUlDb250cm9scyhleHRyYWN0KTsKLSAgICAgICAgICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyghZXh0cmFjdCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0V4dHJhY3RJbnRlcmZhY2UoKSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHNlaUludGVyZmFjZU5hbWVUZXh0ID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU0VJSW50ZXJmYWNlTmFtZVRleHQoY29tcG9zaXRlKTsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBzZWlJbnRlcmZhY2VOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWlOYW1lID0gaW50ZXJmYWNlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gc3RhcnRpbmdQb2ludFR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VpTmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgaW50ZXJmYWNlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKHNlaU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21waWxhdGlvblVuaXROYW1lID0gaW50ZXJmYWNlTmFtZSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgSkFWQV9UWVBFX05BTUVfU1RBVFVTID0gSkRUVXRpbHMudmFsaWRhdGVKYXZhVHlwZU5hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTID0gY2hlY2tUeXBlRXhpc3RzKHN0YXJ0aW5nUG9pbnRUeXBlLCBjb21waWxhdGlvblVuaXROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZU1lbWViZXJzVG9FeHRyYWN0TGFiZWwoY29tcG9zaXRlKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyID0gSmF2YTJXU1dpZGdldEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlU0VJTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZSA9IHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gY2hlY2tlZE1ldGhvZHMgPSBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0KLSAgICAgICAgICAgICAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kTWFwLnB1dCgoSU1ldGhvZCljaGVja2VkTWV0aG9kc1tpXSwgbW9kZWwuZ2V0QW5ub3RhdGlvbk1hcCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TWV0aG9kTWFwKG1ldGhvZE1hcCk7Ci0KLSAgICAgICAgICAgICAgICBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID0gY2hlY2tlZE1ldGhvZHMubGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgaWYgKE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPCBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID09IE5VTUJFUl9PRl9QVUJMSUNfTUVUSE9EUykgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEwMDsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHNlbGVjdEFsbEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlbGVjdEFsbEJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICBzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQotICAgICAgICAgICAgICAgIFRhYmxlSXRlbVtdIGNoZWNrZWRNZXRob2RzID0gc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBjaGVja2VkTWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uRXZlbnQgc2VsZWN0aW9uRXZlbnQgPSBldmVudDsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRXZlbnQuZGV0YWlsID0gU1dULkNIRUNLOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FdmVudC5pdGVtID0gdGFibGVJdGVtOwotICAgICAgICAgICAgICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuaGFuZGxlU2VsZWN0KHNlbGVjdGlvbkV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotCi0gICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRGVzZWxlY3RBbGxCdXR0b24oY29tcG9zaXRlKTsKLSAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW1bXSBjaGVja2VkTWV0aG9kcyA9IHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gY2hlY2tlZE1ldGhvZHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkV2ZW50IHNlbGVjdGlvbkV2ZW50ID0gZXZlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkV2ZW50LmRldGFpbCA9IFNXVC5DSEVDSzsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRXZlbnQuaXRlbSA9IHRhYmxlSXRlbTsKLSAgICAgICAgICAgICAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLmhhbmRsZVNlbGVjdChzZWxlY3Rpb25FdmVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHB1YmxpY01ldGhvZHMgPSBKRFRVdGlscy5nZXRQdWJsaWNNZXRob2RzKHN0YXJ0aW5nUG9pbnRUeXBlKTsKLSAgICAgICAgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTID0gcHVibGljTWV0aG9kcy5sZW5ndGg7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRJbnB1dChwdWJsaWNNZXRob2RzKTsKLQotICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyhmYWxzZSk7Ci0gICAgICAgIGVuYWJsZUV4dHJhY3RTRUlDb250cm9scyhmYWxzZSk7Ci0gICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgaWYgKG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RTRUlDb21iby5pbmRleE9mKG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RTRUlDb21iby5hZGQobW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbGVjdFNFSUNvbWJvLnNldFRleHQobW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUobW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVNFSVNlbGVjdGlvbigpIHsKLSAgICAgICAgaWYgKCF1c2VTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJVHlwZSBzZWlUeXBlID0gSkRUVXRpbHMuZ2V0VHlwZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBzZWxlY3RTRUlDb21iby5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoc2VpVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElNZXRob2RbXSBzZWlNZXRob2RzID0gc2VpVHlwZS5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJTWV0aG9kIHNlaU1ldGhvZCA6IHNlaU1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgSU1ldGhvZFtdIGltcGxNZXRob2RzID0gc3RhcnRpbmdQb2ludFR5cGUuZmluZE1ldGhvZHMoc2VpTWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxNZXRob2RzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZChDWEZDcmVhdGlvblVJTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW1wbGVtZW50c01lc3NhZ2Uoc2VpVHlwZSwgc2VpTWV0aG9kKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IHZhbGlkYXRlU0VJQWRkaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShzZWxlY3RTRUlDb21iby5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbXBsZW1lbnRzTWVzc2FnZShJVHlwZSBzZWlUeXBlLCBJTWV0aG9kIHNlaU1ldGhvZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcihzZWlUeXBlLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKHNlaU1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHNlaU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyVHlwZSA9IFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChwYXJhbWV0ZXJUeXBlKTsKLSAgICAgICAgICAgIGlmIChpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVNFSUFkZGl0aW9uKCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcywgc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9iamVjdCBuYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJTZXJ2aWNlLCBOQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9XRUJTRVJWSUNFX05BTUVfQVRUUklCVVRFX1BSRVNFTlQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHNlbGVjdFNFSUNvbWJvLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgYnJvd3NlU0VJQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHMoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGUuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBpZiAoZW5hYmxlICYmIChOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTIDwgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTKSkgewotICAgICAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW5hYmxlICYmIChOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID4gMCkpIHsKLSAgICAgICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVuYWJsZSkgewotICAgICAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBmaW5kTW9zdFNldmVyZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKSB7Ci0gICAgICAgIGlmICh1c2VTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIGlmICghc2VsZWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmICFleHRyYWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9PUFRJT04pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2VsZWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVNFSVNlbGVjdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXh0cmFjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiBzZWlJbnRlcmZhY2VOYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19FTlRFUl9TRUlfTkFNRSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTID4gMAotICAgICAgICAgICAgICAgICAgICAmJiBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID09IDApIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9FWFRSQUNURURfTUVUSE9EUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmdQb2ludFR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRyYWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlaUludGVyZmFjZU5hbWVUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwCi0gICAgICAgICAgICAgICAgICAgICYmIE5VTUJFUl9PRl9QVUJMSUNfTUVUSE9EUyA+IDAgJiYgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA+IDApIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIEpBVkFfVFlQRV9OQU1FX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICBKQVZBX1RZUEVfRVhJU1RTX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgZmluZE1vc3RTZXZlcmUoKSB7Ci0gICAgICAgIGlmIChKQVZBX1RZUEVfTkFNRV9TVEFUVVMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotICAgICAgICAgICAgcmV0dXJuIEpBVkFfVFlQRV9OQU1FX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoSkFWQV9UWVBFX0VYSVNUU19TVEFUVVMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotICAgICAgICAgICAgcmV0dXJuIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIGlmIChTRUlfU0VMRUNUSU9OX1NUQVRVUy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gU0VJX1NFTEVDVElPTl9TVEFUVVM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoU0VJX1NFTEVDVElPTl9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSA+PSBKQVZBX1RZUEVfTkFNRV9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIFNFSV9TRUxFQ1RJT05fU1RBVFVTOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTLmdldFNldmVyaXR5KCkgPj0gSkFWQV9UWVBFX05BTUVfU1RBVFVTLmdldFNldmVyaXR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBKQVZBX1RZUEVfRVhJU1RTX1NUQVRVUzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBKQVZBX1RZUEVfTkFNRV9TVEFUVVM7Ci0gICAgfQotCi0gICAgcHVibGljIElTdGF0dXMgY2hlY2tUeXBlRXhpc3RzKElUeXBlIHR5cGUsIFN0cmluZyBjb21waWxhdGlvblVuaXROYW1lKSB7Ci0gICAgICAgIGNvbXBpbGF0aW9uVW5pdE5hbWUgPSBjb21waWxhdGlvblVuaXROYW1lLnRyaW0oKTsKLQotICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCk7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gcGFja2FnZUZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblVuaXROYW1lKTsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCk7Ci0KLSAgICAgICAgaWYgKHJlc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU0NvcmVQbHVnaW4uUExVR0lOX0lELCBKQVhXU0NvcmVNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuYmluZChKQVhXU0NvcmVNZXNzYWdlcy5UWVBFX1dJVEhfTkFNRV9BTFJFQURZX0VYSVNUUywgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXROYW1lLCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSB9KSk7Ci0gICAgICAgIH0KLSAgICAgICAgVVJJIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSUZpbGVTdG9yZSBmaWxlU3RvcmUgPSBFRlMuZ2V0U3RvcmUobG9jYXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChmaWxlU3RvcmUuZmV0Y2hJbmZvKCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5UWVBFX05BTUVfRElGRkVSRU5UX0NBU0VfRVhJU1RTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTdiYTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuSmF2YTJXU1dpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIElTdGF0dXMgV1NETF9GSUxFTkFNRV9PS19TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgSVN0YXR1cyBXU0RMX0ZJTEVOQU1FX0VSUk9SX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19FTlRFUl9WQUxJRF9XU0RMX05BTUUpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVDbGllbnRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVXcmFwZXJGYXVsdEJlYW5zQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlV1NETEJ1dHRvbjsKLSAgICBwcml2YXRlIENvbWJvIHNvYXBCaW5kaW5nQ29tYm87Ci0gICAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlWFNESW1wb3J0czsKLSAgICBwcml2YXRlIFRleHQgd3NkbEZpbGVUZXh0OwotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBKYXZhMldTQ29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxpemUoKSB7Ci0gICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgICAgICBnZW5lcmF0ZVdyYXBlckZhdWx0QmVhbnNCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKTsKLSAgICAgICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgICAgICBlbmFibGVXU0RMR3JvdXAobW9kZWwuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzU29hcDEyQmluZGluZygpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMuc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCBqYXZhMndzR3JvdXAgPSBudWxsOwotICAgICAgICBpZiAobW9kZWwuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBGcm9udGVuZAotICAgICAgICAgICAgLy8gICAgICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZExhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gICAgICAgICAgICBmaW5hbCBDb21ibyBmcm9udGVuZENvbWJvID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRnJvbnRlbmRDb21ibyhjb21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIGZyb250ZW5kQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgICAgIC8vIEphdmEyV1MgR3JvdXAKLSAgICAgICAgICAgIGphdmEyd3NHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICAgICAgamF2YTJ3c0dyb3VwLnNldFRleHQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfR1JPVVBfTEFCRUwpOwotICAgICAgICAgICAgR3JpZExheW91dCBqYXZhMndzbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQotICAgICAgICAgICAgamF2YTJ3c2xheW91dC5udW1Db2x1bW5zID0gMzsKLQotICAgICAgICAgICAgamF2YTJ3c2xheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLSAgICAgICAgICAgIGphdmEyd3NHcm91cC5zZXRMYXlvdXQoamF2YTJ3c2xheW91dCk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICAgICAgamF2YTJ3c0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgICAgICAvLyBHZW4gQ2xpZW50Ci0gICAgICAgICAgICBnZW5lcmF0ZUNsaWVudEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlQ2xpZW50QnV0dG9uKGphdmEyd3NHcm91cCwgbW9kZWwpOwotCi0gICAgICAgICAgICAvLyBHZW4gU2VydmVyCi0gICAgICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKGphdmEyd3NHcm91cCwgbW9kZWwpOwotCi0gICAgICAgICAgICAvLyBHZW4gV3JhcHBlciBhbmQgRmF1bHQgQmVhbgotICAgICAgICAgICAgZ2VuZXJhdGVXcmFwZXJGYXVsdEJlYW5zQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uKAotICAgICAgICAgICAgICAgICAgICBqYXZhMndzR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICAgICAgLy8gR2VuIFdTREwKLSAgICAgICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlV1NETEJ1dHRvbihqYXZhMndzR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZVdTRExHcm91cChnZW5lcmF0ZVdTRExCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIEdyb3VwIHdzZGxHcm91cCA9IG5ldyBHcm91cChqYXZhMndzR3JvdXAgPT0gbnVsbCA/IGNvbXBvc2l0ZSA6IGphdmEyd3NHcm91cCwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGxHcm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgd3NkbEdyb3VwLnNldExheW91dCh3c2RsR3JvdXBMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHdzZGxHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVXU0RMRmlsZU5hbWVMYWJlbCh3c2RsR3JvdXApOwotCi0gICAgICAgIHdzZGxGaWxlVGV4dCA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExGaWxlTmFtZVRleHQod3NkbEdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIHdzZGxGaWxlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHdzZGxGaWxlVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTT0FQQmluZGluZ0xhYmVsKHdzZGxHcm91cCk7Ci0KLSAgICAgICAgc29hcEJpbmRpbmdDb21ibyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNPQVBCaW5nQ29tYm8od3NkbEdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVYU0RJbXBvcnRzQnV0dG9uKHdzZGxHcm91cCwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGVuYWJsZVdTRExHcm91cChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKTsKLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlV1NETEdyb3VwKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHdzZGxGaWxlVGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRXU0RMRmlsZU5hbWVTdGF0dXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgZ2V0V1NETEZpbGVOYW1lU3RhdHVzKCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFdTRExfRklMRU5BTUVfT0tfU1RBVFVTOwotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gd3NkbEZpbGVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgaWYgKCFXU0RMVXRpbHMuaXNWYWxpZFdTRExGaWxlTmFtZSh3c2RsRmlsZU5hbWUpKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBXU0RMX0ZJTEVOQU1FX0VSUk9SX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ5ZDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IgamF2YTJXU1dpZGdldENvbnRyaWJ1dG9yOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTQ29uZmlnV2lkZ2V0IGphdmEyV1NDb25maWdXaWRnZXQgPSBuZXcgSmF2YTJXU0NvbmZpZ1dpZGdldCgpOwotCi0gICAgcHVibGljIEphdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5KCkgewotCi0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldChJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0gICAgICAgICAgICAgICAgIkphdmEyV1NEYXRhTW9kZWwiLCBKYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhMldTRGF0YU1vZGVsKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgamF2YTJXU0NvbmZpZ1dpZGdldC5zZXRKYXZhMldTRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgamF2YTJXU1dpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXtjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKX0pOwotCi0gICAgICAgIGphdmEyV1NXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh0aXRsZSk7Ci0gICAgICAgIGphdmEyV1NXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfUEFHRV9ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpKSk7Ci0gICAgICAgIGphdmEyV1NXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhMldTQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NTRkMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuSmF2YTJXU1dpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBJTVBMX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVR5cGUgc3RhcnRpbmdQb2ludFR5cGU7Ci0KLSAgICBwcml2YXRlIENvbWJvIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm87Ci0gICAgCi0gICAgcHVibGljIEphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgdGhpcy5zdGFydGluZ1BvaW50VHlwZSA9IHN0YXJ0aW5nUG9pbnRUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgLmNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8oY29tcG9zaXRlLCBtb2RlbCwgc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVJbXBsZW1lbnRhdGlvblNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCi0gICAgICAgIAlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAJdmFsaWRhdGVJbXBsZW1lbnRhdGlvblNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIEJ1dHRvbiBicm93c2VJbXBsQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlQnJvd3NlQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYnJvd3NlSW1wbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIGJyb3dzZUltcGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFNoZWxsKCksIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19USVRMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUyk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IHNlbGVjdGlvbkRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVybkNvZGUgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc2VsZWN0ZWRDb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgc2VsZWN0aW9uRGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3RlZEltcGxlbWVudGF0aW9uID0gc2VsZWN0ZWRDb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBpbXBscyA9IEFycmF5cy5hc0xpc3Qoc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRJdGVtcygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBscy5jb250YWlucyhzZWxlY3RlZEltcGxlbWVudGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAJc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5hZGQoc2VsZWN0ZWRJbXBsZW1lbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5zZXRUZXh0KHNlbGVjdGVkSW1wbGVtZW50YXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIElNUExfU0VMRUNUSU9OX1NUQVRVUzsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSW1wbGVtZW50YXRpb25TZWxlY3Rpb24oKSB7Ci0gICAgICAgIElUeXBlIGltcGxUeXBlID0gSkRUVXRpbHMuZ2V0VHlwZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgIGlmIChpbXBsVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElNZXRob2RbXSBzZWlNZXRob2RzID0gc3RhcnRpbmdQb2ludFR5cGUuZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgICAgIGZvciAoSU1ldGhvZCBzZWlNZXRob2QgOiBzZWlNZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIElNZXRob2RbXSBpbXBsTWV0aG9kID0gaW1wbFR5cGUuZmluZE1ldGhvZHMoc2VpTWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAJSU1QTF9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgCSAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZChDWEZDcmVhdGlvblVJTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW1wbGVtZW50c01lc3NhZ2Uoc3RhcnRpbmdQb2ludFR5cGUsIHNlaU1ldGhvZCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIElNUExfU0VMRUNUSU9OX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoc3RhcnRpbmdQb2ludFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZShzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCUlNUExfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgIAkgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldFQlNFUlZJQ0VfSU1QTEVNRU5UQVRJT05fTk9UX0ZPVU5ELAotICAgICAgICAgICAgICAgICAgICAJCXNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uZ2V0VGV4dCgpKSk7ICAgCi0gICAgICAgIH0gICAgICAgIAotCX0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEltcGxlbWVudHNNZXNzYWdlKElUeXBlIHNlaVR5cGUsIElNZXRob2Qgc2VpTWV0aG9kKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKHNlaVR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoc2VpTWV0aG9kLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVzID0gc2VpTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJUeXBlID0gU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRlclR5cGVzW2ldKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKHBhcmFtZXRlclR5cGUpOwotICAgICAgICAgICAgaWYgKGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBtZXNzYWdlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTU2VsZWN0U0VJV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxMDk1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTU2VsZWN0U0VJV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRQT0lOVF9JTlRFUkZBQ0UgPSAiZW5kcG9pbnRJbnRlcmZhY2UiOwotCi0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciBjbGFzc1dpZGdldENvbnRyaWJ1dG9yOwotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IgaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIEphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldCBqYXZhMldTQ2xhc3NDb25maWdXaWRnZXQgPSBuZXcgSmF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0KCk7Ci0gICAgcHJpdmF0ZSBKYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0IGphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQgPSBuZXcgSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldCgpOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVR5cGUgc3RhcnRpbmdQb2ludFR5cGU7Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLSAgICAgICAgaWYgKHN0YXJ0aW5nUG9pbnRUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yID09IG51bGwgfHwgY2xhc3NXaWRnZXRDb250cmlidXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0YXJ0aW5nUG9pbnRUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0aW5nUG9pbnRUeXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgIGNoZWNrRm9yU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IHN0YXJ0aW5nUG9pbnRUeXBlLmdldEFubm90YXRpb25zKCk7Ci0gICAgICAgIGZvciAoSUFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotICAgICAgICAgICAgICAgIGZvciAoSU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0TWVtYmVyTmFtZSgpLmVxdWFscyhFTkRQT0lOVF9JTlRFUkZBQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGUgc2VpVHlwZSA9IHN0YXJ0aW5nUG9pbnRUeXBlLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlaVR5cGUgIT0gbnVsbCAmJiBzZWlUeXBlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0VXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldChJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0gICAgICAgICAgICAgICAgIkphdmEyV1NEYXRhTW9kZWwiLCBKYXZhMldTU2VsZWN0U0VJV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotICAgICAgICAgICAgICAgICJKYXZhU3RhcnRpbmdQb2ludFR5cGUiLCBKYXZhMldTU2VsZWN0U0VJV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhMldTRGF0YU1vZGVsKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICBqYXZhMldTQ2xhc3NDb25maWdXaWRnZXQuc2V0SmF2YTJXU0RhdGFNb2RlbChtb2RlbCk7Ci0gICAgICAgIGphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQuc2V0SmF2YTJXU0RhdGFNb2RlbChtb2RlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YVN0YXJ0aW5nUG9pbnRUeXBlKElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlKSB7Ci0gICAgICAgIHRoaXMuc3RhcnRpbmdQb2ludFR5cGUgPSBzdGFydGluZ1BvaW50VHlwZTsKLSAgICAgICAgamF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0LnNldEphdmFTdGFydGluZ1BvaW50VHlwZShzdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgICAgIGphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQuc2V0SmF2YVN0YXJ0aW5nUG9pbnRUeXBlKHN0YXJ0aW5nUG9pbnRUeXBlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgY2xhc3NXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgICAgICBTdHJpbmcgY2xhc3NDb25maWdUaXRsZSA9IENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0NMQVNTX0NPTkZJR19QQUdFX1RJVExFLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLCBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpfSk7Ci0gICAgICAgIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUoY2xhc3NDb25maWdUaXRsZSk7Ci0gICAgICAgIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0NMQVNTX0NPTkZJR19QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgY2xhc3NXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhMldTQ2xhc3NDb25maWdXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIFN0cmluZyBpbnRlcmZhY2VDb25maWdUaXRsZSA9IENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9USVRMRSwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117Y29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSwgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKX0pOwotICAgICAgICBpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZShpbnRlcmZhY2VDb25maWdUaXRsZSk7Ci0gICAgICAgIGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfREVTQ1JJUFRJT04pOwotICAgICAgICBpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOTFkNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2Vycy5QYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2Vycy5QYWNrYWdlTmFtZVRhYmxlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5XU0RMMkphdmFXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0gICAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotICAgIAotICAgIHByaXZhdGUgQ29tYm8gb3V0cHV0RGlyQ29tYm87Ci0gICAgcHJpdmF0ZSBUZXh0IHBhY2thZ2VOYW1lVGV4dDsKLSAgICBwcml2YXRlIEJ1dHRvbiBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uOwotICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgcGFja2FnZU5hbWVUYWJsZVZpZXdlcjsKLSAgICBwcml2YXRlIENvbWJvIHNlcnZpY2VOYW1lQ29tYm87Ci0gICAgcHJpdmF0ZSBMaXN0IGJpbmRpbmdGaWxlc0xpc3Q7Ci0gICAgCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIG5hbWVzcGFjZUNvbXBvc2l0ZTsKLSAgICBwcml2YXRlIGludCBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQgPSAtMTsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbGl6ZSgpIHsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5wb3B1bGF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKG91dHB1dERpckNvbWJvLCBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldFRleHQobW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuZ2V0KG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgZXhwYW5kTmFtZXNwYWNlQ29tcG9zaXRlKGZhbHNlKTsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuc2V0SW5wdXQobW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5wb3B1bGF0ZVNlcnZpY2VOYW1lQ29tYm8oc2VydmljZU5hbWVDb21ibywgbW9kZWwpOwotCi0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3QucmVtb3ZlQWxsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBPdXRwdXQgRGlyCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlT3V0cHV0RGlyZWN0b3J5TGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgb3V0cHV0RGlyQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgb3V0cHV0RGlyQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gUGFja2FnZSBOYW1lOgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhY2thZ2VOYW1lTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUZXh0ID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZVRleHQobWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBwYWNrYWdlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSkRUVXRpbHMudmFsaWRhdGVQYWNrYWdlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKG1haW5Db21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZXhwYW5kTmFtZXNwYWNlQ29tcG9zaXRlKG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIFNlcnZpY2UgTmFtZToKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVTZXJ2aWNlTmFtZUxhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIHNlcnZpY2VOYW1lQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlcnZpY2VOYW1lQ29tYm8obWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIGJpbmRpbmdGaWxlc0xhYmVsID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVCaW5kaW5nRmlsZXNMYWJlbChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBiaW5kaW5nRmlsZXNMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0ID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVCaW5kaW5nRmlsZXNMaXN0KG1haW5Db21wb3NpdGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gMzsKLSAgICAgICAgYmluZGluZ0ZpbGVzTGlzdC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBCdXR0b24gYWRkQmluZGluZ0ZpbGVCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUFkZEJpbmRpbmdGaWxlQnV0dG9uKG1haW5Db21wb3NpdGUsIG1vZGVsLAotICAgICAgICAgICAgICAgIGJpbmRpbmdGaWxlc0xpc3QpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGFkZEJpbmRpbmdGaWxlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEJ1dHRvbiByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24obWFpbkNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICBtb2RlbCwgYmluZGluZ0ZpbGVzTGlzdCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYTUxDYXRhbG9nTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgVGV4dCB4bWxDYXRhbG9nVGV4dCA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWE1MQ2F0YWxvZ1RleHQobWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgeG1sQ2F0YWxvZ1RleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYTUxDYXRhbG9nQnJvd3NlQnV0dG9uKG1haW5Db21wb3NpdGUpOwotICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4cGFuZE5hbWVzcGFjZUNvbXBvc2l0ZShib29sZWFuIGV4cGFuZCkgewotICAgICAgICBpZiAoZXhwYW5kKSB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlQ29tcG9zaXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNzsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnBhY2soKTsKLQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZSA9IGdldE5hbWVzcGFjZU1hcHBpbmdDb21wb3NpdGUobmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBvaW50IGdyb3VwU2l6ZSA9IG5hbWVzcGFjZUNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQgPSBncm91cFNpemUueTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgICAgICBQb2ludCBzaGVsbFNpemUgPSBzaGVsbC5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgc2hlbGwuc2V0U2l6ZShzaGVsbFNpemUueCwgc2hlbGxTaXplLnkgKyBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLmxheW91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnBhY2soKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLmxheW91dCgpOwotICAgICAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgc2hlbGxTaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIHNoZWxsLnNldFNpemUoc2hlbGxTaXplLngsIHNoZWxsU2l6ZS55IC0gbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBnZXROYW1lc3BhY2VNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJsZSBwYWNrYWdlTmFtZVRhYmxlID0gY3JlYXRlTmFtZXNwYWNlTWFwcGluZ1RhYmxlKG5hbWVzcGFjZUNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA2OwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHJldHVybiBuYW1lc3BhY2VDb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUYWJsZSBjcmVhdGVOYW1lc3BhY2VNYXBwaW5nVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUgotICAgICAgICAgICAgICAgIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotICAgICAgICBUYWJsZSBwYWNrYWdlTmFtZVRhYmxlID0gcGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExOYW1lc3BhY2VWaWV3ZXJDb2x1bW4ocGFja2FnZU5hbWVUYWJsZVZpZXdlcik7Ci0KLSAgICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZUNvbHVtbigKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLCBtb2RlbCk7Ci0gICAgICAgIAotICAgICAgICBUZXh0Q2VsbEVkaXRvciB0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcihwYWNrYWdlTmFtZVRhYmxlVmlld2VyLmdldFRhYmxlKCkpOwotICAgICAgICB0ZXh0Q2VsbEVkaXRvci5hZGRMaXN0ZW5lciggbmV3IElDZWxsRWRpdG9yTGlzdGVuZXIoKSB7Ci0JCQotCQkJcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSwgYm9vbGVhbiBuZXdWYWxpZFN0YXRlKSB7Ci0JCQkJc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7CQkJCQotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGNhbmNlbEVkaXRvcigpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkgewotCQkJfQotCQl9KTsKLSAgICAgICAgCi0gICAgICAgIHRleHRDZWxsRWRpdG9yLnNldFZhbGlkYXRvcihuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0JCQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBwYWNrYWdlTmFtZSkgewotCSAgICAgICAgICAgIHN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlUGFja2FnZU5hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgcGFja2FnZU5hbWUudG9TdHJpbmcoKSk7Ci0JICAgICAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spIHsKLQkgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIHJldHVybiBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJfQotCQl9KTsKLQotICAgICAgICBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbi5zZXRFZGl0aW5nU3VwcG9ydChuZXcgUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydChwYWNrYWdlTmFtZVRhYmxlVmlld2VyLAotICAgICAgICAJCXRleHRDZWxsRWRpdG9yLCBtb2RlbCkpOwotCi0gICAgICAgIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIDEwMCwgdHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uV2VpZ2h0RGF0YSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFBhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuc2V0SW5wdXQobW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKSk7Ci0KLSAgICAgICAgVGFibGVJdGVtW10gdGFibGVJdGVtcyA9IHBhY2thZ2VOYW1lVGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGVJdGVtc1tpXTsKLSAgICAgICAgICAgIGlmIChtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5jb250YWluc0tleSh0YWJsZUl0ZW0uZ2V0VGV4dCgwKSkpIHsKLSAgICAgICAgICAgICAgICB0YWJsZUl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWVUYWJsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTAwYmM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YURlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNvbmZpZ1dpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvcjsKLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YUNvbmZpZ1dpZGdldCB3c2RsMkphdmFDb25maWdXaWRnZXQgPSBuZXcgV1NETDJKYXZhQ29uZmlnV2lkZ2V0KCk7Ci0gICAgcHJpdmF0ZSBXU0RMMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldCB3c2RsMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldCA9IG5ldyBXU0RMMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldCgpOwotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmICh3c2RsMkphdmFXaWRnZXRDb250cmlidXRvciA9PSBudWxsIHx8IHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgIGlmICh3aWRnZXRDb250cmlidXRvciA9PSB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvcikgewotICAgICAgICAgICAgcmV0dXJuIHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0gICAgICAgICAgICAgICAgIldTREwySmF2YURhdGFNb2RlbCIsIFdTREwySmF2YUNvbmZpZ1dpZGdldEZhY3RvcnkuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V1NETDJKYXZhRGF0YU1vZGVsKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB3c2RsMkphdmFDb25maWdXaWRnZXQuc2V0V1NETDJKYXZhRGF0YU1vZGVsKG1vZGVsKTsKLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQuc2V0V1NETDJKYXZhRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgd3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgQ1hGQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V1NETDJKYXZhQ29udGV4dCgpOwotICAgICAgICBTdHJpbmcgd3NkbDJKYXZhUGFnZVRpdGxlID0gQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9QQUdFX1RJVExFLCBuZXcgT2JqZWN0W117Y29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgd3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUod3NkbDJKYXZhUGFnZVRpdGxlKTsKLSAgICAgICAgd3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFHRV9ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpKSk7Ci0gICAgICAgIHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdzZGwySmF2YUNvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBTdHJpbmcgd3NkbDJKYXZhRGVmYXVsdHNQYWdlVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0RFRkFVTFRTX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh3c2RsMkphdmFEZWZhdWx0c1BhZ2VUaXRsZSk7Ci0gICAgICAgIHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3IKLSAgICAgICAgLnNldERlc2NyaXB0aW9uKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfREVGQVVMVFNfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIHdzZGwySmF2YURlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNiZWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5XU0RMMkphdmFXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCB3c2RsMmphdmFHcm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0VGV4dChDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMmphdmFsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YWxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGVmYXVsdFZhbHVlc0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTm9BZGRyZXNzQmluZGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgR3JvdXAgeGpjQXJnR3JvdXAgPSBuZXcgR3JvdXAobWFpbkNvbXBvc2l0ZSwgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldFRleHQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB4amNBcmdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0KHhqY0FyZ0xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJsZSB4amNBcmdzVGFibGUgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0FyZ1RhYmxlKHhqY0FyZ0dyb3VwLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDRGVmYXVsdFZhbHVlc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbldpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25XaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2MwNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbldpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgc3RvcCBnYXAgd29ya2Fyb3VuZCBmb3IgYnVncyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQzMjg2Ij4jMjQzMjg2PC9hPgotICogYW5kIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDMyOTAiPiMyNDMyOTA8L2E+Ci0gKiA8cD4KLSAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCA8Y29kZT5XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZDwvY29kZT4KLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YVByb2plY3RTZWxlY3Rpb25XaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0JCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5pdGlhbFByb2plY3QiLCAgLy8kTk9OLU5MUy0xJAotCQkJCVdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmNsYXNzKTsKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgIC8vJE5PTi1OTFMtMSQKLQkgICAgCQlXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOyAvLyROT04tTkxTLTEkCi0JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlByb2plY3QiLCBXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZC5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTM4YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkNYRkRlcGxveUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkpBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LkFic3RyYWN0V2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBDWEZXZWJTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlIHsKLQotICAgIHB1YmxpYyBDWEZXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pIHsKLSAgICAgICAgc3VwZXIoaW5mbyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIAotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRlcGxveShJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIAotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRldmVsb3AoSUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsZWN0aW9uLAotICAgICAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICBWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgICAgRWNsaXBzZUVudmlyb25tZW50IGVjbGlwc2VFbnZpcm9ubWVudCA9IChFY2xpcHNlRW52aXJvbm1lbnQpIGVudmlyb25tZW50OwotICAgICAgICByZWdpc3RlckRhdGFNYXBwaW5ncyhlY2xpcHNlRW52aXJvbm1lbnQuZ2V0Q29tbWFuZE1hbmFnZXIoKS5nZXRNYXBwaW5nUmVnaXN0cnkoKSk7Ci0KLSAgICAgICAgaWYgKGN0eC5nZXRTY2VuYXJpbygpLmdldFZhbHVlKCkgPT0gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTVVQKSB7Ci0gICAgICAgICAgICBKYXZhMldTRGF0YU1vZGVsIGphdmEyV1NEYXRhTW9kZWwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhMldTRGF0YU1vZGVsKCk7Ci0gICAgICAgICAgICBqYXZhMldTRGF0YU1vZGVsLnNldFByb2plY3ROYW1lKHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIGphdmEyV1NEYXRhTW9kZWwuc2V0SmF2YVN0YXJ0aW5nUG9pbnQodGhpcy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldEltcGxVUkwoKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IEphdmEyV1NWYWxpZGF0ZUlucHV0Q29tbWFuZChqYXZhMldTRGF0YU1vZGVsKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZChqYXZhMldTRGF0YU1vZGVsKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IEphdmEyV1NTZWxlY3RTRUlDb21tYW5kKGphdmEyV1NEYXRhTW9kZWwpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kKGphdmEyV1NEYXRhTW9kZWwpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgSmF2YTJXU0NvbW1hbmQoamF2YTJXU0RhdGFNb2RlbCkpOwotICAgICAgICB9IGVsc2UgaWYgKGN0eC5nZXRTY2VuYXJpbygpLmdldFZhbHVlKCkgPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pIHsKLSAgICAgICAgICAgIFdTREwySmF2YURhdGFNb2RlbCB3c2RsMkphdmFEYXRhTW9kZWwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMMkphdmFEYXRhTW9kZWwoKTsKLSAgICAgICAgICAgIHdzZGwySmF2YURhdGFNb2RlbC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IFdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kKHdzZGwySmF2YURhdGFNb2RlbCkpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZCh3c2RsMkphdmFEYXRhTW9kZWwsIHByb2plY3ROYW1lLCAKLSAgICAgICAgICAgIAkJZ2V0V2ViU2VydmljZUluZm8oKS5nZXRXc2RsVVJMKCkpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhQ29tbWFuZCh3c2RsMkphdmFEYXRhTW9kZWwsIHRoaXMpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NDb21tYW5kLmNsYXNzLCAiQ1hGRGF0YU1vZGVsIiwgQ1hGRGVwbG95Q29tbWFuZC5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkNYRkRhdGFNb2RlbCIsIENYRkRlcGxveUNvbW1hbmQuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENYRkRlcGxveUNvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnRUeXBlIiwgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgcnVuKElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIFZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBDWEZEZXBsb3lDb21tYW5kKHByb2plY3ROYW1lLCB0aGlzKSk7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlSW5mbyBnZXRXZWJTZXJ2aWNlSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFdlYlNlcnZpY2VJbmZvKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZVJ1bnRpbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2VSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OGM2ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud3NydC5DWEZXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LkFic3RyYWN0V2ViU2VydmljZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUNsaWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUluZm87Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGV2ViU2VydmljZVJ1bnRpbWUgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDWEZXZWJTZXJ2aWNlKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJV2ViU2VydmljZUNsaWVudCBnZXRXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDWEZXZWJTZXJ2aWNlQ2xpZW50KGluZm8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjFkMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwMzQxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2FkZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgTm92IDA3IDIzOjU4OjU1IEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjZTQwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjQuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuZGlhbG9nczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2Vyczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjQuMyIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwxLjUuMCkiCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1DcmVhdGVkLUJ5OiAxLjUuMF8xNC1iMDMgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNjdjNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL29iajE2L2xpYnJhcnlfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9pY29ucy9vYmoxNi9saWJyYXJ5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTVlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL29iajE2L2xpYnJhcnlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9pY29ucy93aXpiYW4vbGlicmFyeV93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL3dpemJhbi9saWJyYXJ5X3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNWRjMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL3dpemJhbi9saWJyYXJ5X3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGE4MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBVSSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLVBSRUZFUkVOQ0VfQ0FURUdPUllfQ1hGX1JVTlRJTUU9Q1hGIDIueCBQcmVmZXJlbmNlcwotUFJPUEVSVElFU19DQVRFR09SWV9DWEZfUlVOVElNRT1DWEYgMi54IFNldHRpbmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTExODUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnByZWZlcmVuY2VzLkNYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UiCi0gICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9DWEZfUlVOVElNRSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgbmFtZT0iJVBST1BFUlRJRVNfQ0FURUdPUllfQ1hGX1JVTlRJTUUiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5wcm9wZXJ0aWVzLkNYRlByb3BlcnR5UGFnZSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnByb3BlcnR5UGFnZXMuQ1hGUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iY3hmLmNvcmUiIC8+Ci0gICAgICAgICAgICA8L2FkYXB0PiAgICAgICAgIAotICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMiPgotICAgICAgPHdpemFyZC1wYWdlcyBhY3Rpb249ImN4Zi5jb3JlLmluc3RhbGwiPgotICAgICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHMuQ1hGRmFjZXRJbnN0YWxsV2l6YXJkUGFnZSI+Ci0gICAgICAgICA8L3BhZ2U+Ci0gICAgICA8L3dpemFyZC1wYWdlcz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjVjNjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDWEZVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSW1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfSE9NRV9UQUJfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX0hPTUVfRElSX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX05PVF9TRVQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0FERF9CVVRUT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VESVRfQlVUVE9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SRU1PVkVfQlVUVE9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9CUk9XU0VfQlVUVE9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9DWEZfVkVSU09OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0RFU0NSSVBUSU9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9WRVJTSU9OX0NPTFVNTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9MT0NBVElPTl9DT0xVTU5fTkFNRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9QUk9QRVJUWV9QQUdFX1JVTlRJTUVfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX0NPTkZJR1VSRV9JTlNUQUxMRURfUlVOVElNRVNfTEFCRUw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfSU5TVEFMTF9XSVpBUkRfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfSU5TVEFMTF9XSVpBUkRfUEFHRV9ERVNDUklQVElPTjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9GQUNFVF9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9GQUNFVF9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU0RMX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NETF9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQUklOR19DT05GSUdfUFJFRkVSRU5DRVNfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX0xJTks7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfREVGQVVMVF9EQVRBQklORElOR19MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NETF9HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5fQ0xJRU5UX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1NFUlZFUl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTl9JTVBMRU1FTlRBVElPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTl9XUkFQUEVSX0ZBVUxUX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1dTRExfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19ERUZBVUxUX1NPQVBCSU5ESU5HX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1hTRF9JTVBPUlRTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlZBTElEX1ZFUlNJT05fRk9STUFUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9WRVJTSU9OX05PVF9TUEVDSUZJRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1BSSU5HX0NPTkZJR19HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTUFJJTkdfQ09ORklHX1VTRV9DWEZfU0VSVkxFVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTUFJJTkdfQ09ORklHX1VTRV9DWEZfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BST0NFU1NfU09BUF9IRUFERVJTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTUFQUElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfVVNFX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1dTRExfVkVSU0lPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfVVNFX0RFRkFVTFRfVkFMVUVTOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVElPTlNfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVElPTlNfR1JPVVBfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19HRU5FUkFURV9XRUJfTUVUSE9EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0dFTkVSQVRFX1dFQl9QQVJBTTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BTk5PVEFUSU9OU19QUk9DRVNTSU5HX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TT0FQMTJfQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfQ1JFQVRFX1hTRF9JTVBPUlRTX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19EQVRBQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRlJPTlRFTkRfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1dTRExfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1dSQVBQRVJCRUFOX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5FUkFURV9DTElFTlRfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VORVJBVEVfQU5UX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19CRUFOU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfVEFSR0VUX05BTUVTUEFDRV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VSVklDRV9OQU1FX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19QT1JUX05BTUVfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0FERFJFU1NfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfV1NETF9GSUxFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19PVVRQVVRfRklMRV9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19VU0VfU0VJX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1VTRV9TRUlfSU5GT19MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19CUk9XU0VfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19FWFRSQUNUX1NFSTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VYVFJBQ1RfU0VJX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRVhUUkFDVF9TRUlfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VYVFJBQ1RfTUVNQkVSU19MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX0FMTF9CVVRUT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19ERVNFTEVDVF9BTExfQlVUVE9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT05fVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9GUk9OVEVORF9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9EQVRBQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9XU0RMX1ZFUlNJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUX1ZBTFVFU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9FWENMVURFX05BTUVTUEFDRV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QUk9DRVNTX1NPQVBfSEVBREVSU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUX05BTUVTUEFDRV9MT0FESU5HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0VYQ0xVREVfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfV1NETF9MT0NBVElPTl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX05PX0FERFJFU1NfQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9BVVRPX05BTUVfUkVTT0xVVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWE1MX0NBVEFMT0dfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR1NfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19DT0xVTU5fTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0RFU0NSSVBUSU9OX0NPTFVNTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfREVGQVVMVF9WQUxVRVM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19UT1NUUklORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX1RPU1RSSU5HX01VTFRJTElORTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX1RPU1RSSU5HX1NJTVBMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0xPQ0FUT1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19TWU5DX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19NQVJLX0dFTkVSQVRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0VQSVNPREVfRklMRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfV09SS1NQQUNFX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfU1lTVEVNX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfTk9UX0ZPVU5EX0VSUk9SOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUlk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUllfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QQUNLQUdFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFDS0FHRV9OQU1FX09QVElPTkFMX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfV1NETF9OQU1FU1BBQ0VfQ09MVU1OX0hFQURFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFDS0FHRV9OQU1FX0NPTFVNTl9IRUFERVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfU0VSVklDRV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9CSU5ESU5HX0ZJTEVTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9CSU5ESU5HX05BTUVfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFU19BREQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfUkVNT1ZFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfTUVTU0FHRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19GSUxURVJfTkFNRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YTUxfQ0FUTE9HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YTUxfQ0FUTE9HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hNTF9DQVRMT0dfQlJPV1NFOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENYRlVJTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGVUlNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEyMjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRlVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRlVJUGx1Z2luIHBsdWdpbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBDWEZVSVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUltZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL0NYRlVJbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlYWZhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUltZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jQ1hGIFByZWZlcmVuY2UgUGFnZXMKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX05BTUU9JkNYRiBSdW50aW1lCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9UT09MVElQPUJyb3dzZSBhbmQgc2VsZWN0IENYRiBCaW5hcnkgZGlzdHJpYnV0aW9uIGZvbGRlcgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9IT01FX0RJUl9MQUJFTD1DWEYgJmhvbWU6Ci1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9OT1RfU0VUPU1pc3NpbmcgQ1hGIGphcjogUGxlYXNlIHNlbGVjdCB0aGUgQ1hGIGhvbWUgZGlyZWN0b3J5LgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0FERF9CVVRUT05fTEFCRUw9JkFkZC4uLgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VESVRfQlVUVE9OX0xBQkVMPSZFZGl0Li4uCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUkVNT1ZFX0JVVFRPTl9MQUJFTD0mUmVtb3ZlCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQlJPV1NFX0JVVFRPTl9MQUJFTD0mQnJvd3NlLi4uCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX1ZFUlNPTl9MQUJFTD1WZXJzaW9uOgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUj1FeHBvcnQgcnVudGltZSBsaWJyYXJpZXMgdG8gV0VCLUlORi9saWIgYXQgZGVwbG95bWVudCB0aW1lCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfREVTQ1JJUFRJT05fTEFCRUw9QWRkLCByZW1vdmUgb3IgZWRpdCBDWEYgcnVudGltZXMuIEJ5IGRlZmF1bHQsIHRoZSBjaGVja2VkIENYRiBydW50aW1lIGlzIGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIG9mIGEgcHJvamVjdCB3aGVuIGluc3RhbGxpbmcgdGhlIENYRiBmYWNldC4KLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9WRVJTSU9OX0NPTFVNTl9OQU1FPVZlcnNpb24KLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9MT0NBVElPTl9DT0xVTU5fTkFNRT1Mb2NhdGlvbgotCi1DWEZfUFJPUEVSVFlfUEFHRV9SVU5USU1FX0xBQkVMPUNYRiBydW50aW1lOgotQ1hGX0NPTkZJR1VSRV9JTlNUQUxMRURfUlVOVElNRVNfTEFCRUw9PEE+Q29uZmlndXJlIGluc3RhbGxlZCBydW50aW1lczwvQT4KLQotQ1hGX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEU9Q1hGIFJ1bnRpbWUKLUNYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OPVNwZWNpZnkgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBDWEYgcnVudGltZS4KLQotQ1hGX0ZBQ0VUX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEU9Q1hGIEZhY2V0Ci1DWEZfRkFDRVRfSU5TVEFMTF9XSVpBUkRfUEFHRV9ERVNDUklQVElPTj1Db25maWd1cmUgdGhlIENYRiBmYWNldCBzZXR0aW5ncy4KLSAgICAKLUpBVkEyV1NETF9QUkVGRVJFTkNFU19UQUJfTkFNRT1KYXZhMldTREwKLUpBVkEyV1NETF9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciB0aGUgSmF2YTJXU0RMIHRvb2wKLQotSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfTkFNRT0mSmF2YTJXUwotSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciB0aGUgSmF2YTJXUyB0b29sCi0KLUFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX0xJTks9U2VlIHRoZSA8QT4nSkFYLVdTJzwvQT4gdGFiIGZvciB0aGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcy4KLQotQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX05BTUU9SkEmWC1XUwotQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA9UGxlYXNlIHNlbGVjdCB0aGUgSkFYLVdTIGFubm90YXRpb25zIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0IG9uIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgYmVmb3JlIGlucHV0IHRvIEphdmEyV1MKLQotV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9OQU1FPSZXU0RMMkphdmEKLVdTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciB0aGUgV1NETDJKYXZhIHRvb2wKLQotU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfTkFNRT0mRW5kcG9pbnQgQ29uZmlnCi1TUFJJTkdfQ09ORklHX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQPVBsZWFzZSBzZWxlY3QgdGhlIGRlZmF1bHQgb3B0aW9uIGZvciBTcHJpbmcgY29uZmlndXJhdGlvbiBnZW5lcmF0aW9uCi1TUFJJTkdfQ09ORklHX1VTRV9DWEZfU0VSVkxFVD1Vc2UgQ1gmRiBTZXJ2bGV0Ci1TUFJJTkdfQ09ORklHX1VTRV9DWEZfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ9VXNlIFNwcmluZyAmQXBwbGljYXRpb24gQ29udGV4dAotCi1DWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTD1EZWZhdWx0ICZGcm9udGVuZDoKLUNYRl9ERUZBVUxUX0RBVEFCSU5ESU5HX0xBQkVMPURlZmF1bHQgJkRhdGFiaW5kbmc6Ci1KQVZBMldTX0dST1VQX0xBQkVMPUphdmEyV1MgR2VuZXJhdGlvbiBPcHRpb25zOgotSkFWQTJXU0RMX0dST1VQX0xBQkVMPUphdmEyV1NETCBHZW5lcmF0aW9uIE9wdGlvbnM6Ci1XU0RMMkpBVkFfR1JPVVBfTEFCRUw9V1NETDJKYXZhIEdlbmVyYXRpb24gT3B0aW9uczoKLUpBVkEyV1NfR0VOX0NMSUVOVF9MQUJFTD1HZW5lcmF0ZSBDbGkmZW50Ci1KQVZBMldTX0dFTl9TRVJWRVJfTEFCRUw9R2VuZXJhdGUgU2VyJnZlcgotSkFWQTJXU19HRU5fSU1QTEVNRU5UQVRJT05fTEFCRUw9R2VuZXJhdGUgJkltcGxlbWVudGF0aW9uCi1KQVZBMldTX0dFTl9XUkFQUEVSX0ZBVUxUX0xBQkVMPUdlbmVyYXRlIFdyYXBwZXIgYW5kIEZhdWx0ICZCZWFucwotSkFWQTJXU19HRU5fV1NETF9MQUJFTD1HZW5lcmF0ZSBXU0QmTAotSkFWQTJXU19ERUZBVUxUX1NPQVBCSU5ESU5HX0xBQkVMPURlZmF1bHQgUyZPQVAgQmluZGluZzoKLUpBVkEyV1NfR0VOX1hTRF9JTVBPUlRTPUdlbmVyYXRlIHNlcGFyYXRlIFhTRCBmb3IgdGhlICZ0eXBlcwotQ1hGX0lOVkFMSURfVkVSU0lPTl9GT1JNQVQ9SW52YWxpZCBWZXJzaW9uIEZvcm1hdAotQ1hGX1ZFUlNJT05fTk9UX1NQRUNJRklFRD1DWEYgdmVyc2lvbiB2YWx1ZSBub3Qgc3BlY2lmaWVkCi1TUFJJTkdfQ09ORklHX0dST1VQX0xBQkVMPUNYRiBFbmRwb2ludCBDb25maWd1cmF0aW9uIE9wdGlvbnM6Ci1XU0RMMkpBVkFfUFJPQ0VTU19TT0FQX0hFQURFUlM9RW5hYmxlICZwcm9jZXNzaW5nIG9mIGltcGxpY2l0IFNPQVAgaGVhZGVycwotV1NETDJKQVZBX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9NQVBQSU5HPUVuYWJsZSAmbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcKLVdTREwySkFWQV9VU0VfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORz1FbmFibGUgdGhlIHVzZSBvZiB0aGUgZGVmYXVsdCAmZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmcKLVdTREwySkFWQV9XU0RMX1ZFUlNJT05fTEFCRUw9V1NETCBWZXJzaW9uOgotV1NETDJKQVZBX1VTRV9ERUZBVUxUX1ZBTFVFUz1HZW5lcmF0ZSAmZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzCi0KLUpBWFdTX0FOTk9UQVRJT05TX0dST1VQX0xBQkVMPUpBWC1XUyBBbm5vdGF0aW9uIEdlbmVyYXRpb24KLUpBWFdTX0FOTk9UQVRJT05TX0dST1VQX1RPT0xUSVA9U2VsZWN0IHRoZSBhbm5vdGF0aW9ucyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgb24gdGhlIGNsYXNzIG9yIGludGVyZmFjZSBiZWZvcmUgaW5wdXQgdG8gSmF2YTJXUwotSkFYV1NfR0VORVJBVEVfV0VCX01FVEhPRD1AV2ViJk1ldGhvZAotSkFYV1NfR0VORVJBVEVfV0VCX1BBUkFNPUBXZWImUGFyYW0KLUpBWFdTX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUj1AUmUmcXVlc3RXcmFwcGVyCi1KQVhXU19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSPUAmUmVzcG9uc2VXcmFwcGVyCi1KQVhXU19BTk5PVEFUSU9OU19QUk9DRVNTSU5HX0dST1VQX0xBQkVMPUpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3NpbmcKLUpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkc9JkVuYWJsZSBhbm5vdGF0aW9uIHZhbGlkYXRpb24gcHJvY2Vzc2luZwotSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19UT09MVElQPVR1cm4gSkFYLVdTIGFubm90YXRpb24gcHJvY2Vzc2luZyBvbiBvciBvZmYgaW4gcHJvamVjdHMgY29uZmlndXJlZCBmb3IgezB9IHdlYiBzZXJ2aWNlcwotICAgIAotSkFWQTJXU19TT0FQMTJfQklORElOR19UT09MVElQPVNwZWNpZnkgdG8gZ2VuZXJhdGUgU09BUCAxLjIgYmluZGluZwotSkFWQTJXU19DUkVBVEVfWFNEX0lNUE9SVFNfVE9PTFRJUD0gT3V0cHV0IHNjaGVtYXMgdG8gc2VwYXJhdGUgZmlsZXMgYW5kIHVzZSBpbXBvcnRzIHRvIGxvYWQgdGhlbSBpbnN0ZWFkIG9mIGlubGluaW5nIHRoZW0gaW50byB0aGUgd3NkbAotSkFWQTJXU19EQVRBQklORElOR19UT09MVElQPSBTcGVjaWZ5IHRoZSBkYXRhIGJpbmRpbmcuIERlZmF1bHQgaXMgamF4YiBmb3IgamF4d3MgZnJvbnRlbmQKLSNKQVZBMldTX0RBVEFCSU5ESU5HX1RPT0xUSVA9IFNwZWNpZnkgdGhlIGRhdGEgYmluZGluZyAoYWVnaXMgb3IgamF4YikuIERlZmF1bHQgaXMgamF4YiBmb3IgamF4d3MgZnJvbnRlbmQsIGFuZCBhZWdpcyBmb3Igc2ltcGxlIGZyb250ZW5kCi1KQVZBMldTX0ZST05URU5EX1RPT0xUSVA9U3BlY2lmeSB0aGUgZnJvbnRlbmQgdG8gdXNlCi0jSkFWQTJXU19GUk9OVEVORF9UT09MVElQPVNwZWNpZnkgdGhlIGZyb250ZW5kIHRvIHVzZS4gamF4d3MgYW5kIHRoZSBzaW1wbGUgZnJvbnRlbmQgYXJlIHN1cHBvcnRlZAotSkFWQTJXU19HRU5FUkFURV9XU0RMX1RPT0xUSVA9U3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgV1NETCBmaWxlCi1KQVZBMldTX0dFTkVSQVRFX1dSQVBQRVJCRUFOX1RPT0xUSVA9U3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbgotSkFWQTJXU19HRU5FUkFURV9DTElFTlRfVE9PTFRJUD1HZW5lcmF0ZSBhIGNsaWVudCBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJc1xuLi4uLi5cbiBqYXZheC54bWwud3MuU2VydmljZSBzZXJ2aWNlID0gamF2YXgueG1sLndzLlNlcnZpY2UuY3JlYXRlKC4uLik7XG4uLi4gY2xpZW50ID0gc2VydmljZS5nZXRQb3J0KC4uLik7XG4KLUpBVkEyV1NfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVA9R2VuZXJhdGUgYSBzZXJ2ZXIgbWFpbmxpbmUgdXNpbmcgSkFYLVdTIEFQSXNcbi4uLi4uXG4gamF2YXgueG1sLndzLkVuZHBvaW50LnB1Ymxpc2goLi4uKTtcbi4uLi4uXG4KLUpBVkEyV1NfR0VORVJBVEVfQU5UX1RPT0xUSVA9U3BlY2lmeSB0byBnZW5lcmF0ZSBhbiBBbnQgYnVpbGQueG1sIGZpbGUKLUpBVkEyV1NfQkVBTlNfVE9PTFRJUD1TcGVjaWZ5IHRoZSBwYXRobmFtZSBvZiBhIGZpbGUgZGVmaW5pbmcgYWRkaXRpb25hbCBTcHJpbmcgYmVhbnMgdG8gY3VzdG9taXNlIGRhdGEgYmluZGluZyBjb25maWd1cmF0aW9uCi1KQVZBMldTX1RBUkdFVF9OQU1FU1BBQ0VfVE9PTFRJUD1TcGVjaWZ5IHRoZSB0YXJnZXQgbmFtZXNwYWNlIHRvIHVzZSBpbiB0aGUgd3NkbAotSkFWQTJXU19TRVJWSUNFX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHRoZSBzZXJ2aWNlIG5hbWUgdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgd3NkbAotSkFWQTJXU19QT1JUX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHRoZSBwb3J0IG5hbWUgdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgd3NkbAotSkFWQTJXU19BRERSRVNTX1RPT0xUSVA9IFNwZWNpZnkgdGhlIHBvcnQgYWRkcmVzcwotCi1KQVZBMldTX1dTRExfRklMRV9OQU1FPSZXU0RMIEZpbGU6Ci1KQVZBMldTX09VVFBVVF9GSUxFX1RPT0xUSVA9U3BlY2lmeSB0aGUgb3V0cHV0IHdzZGwgZmlsZSBuYW1lCi0KLUpBVkEyV1NfVVNFX1NFSV9CVVRUT049JlVzZSBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlOgotSkFWQTJXU19VU0VfU0VJX0lORk9fTEFCRUw9KFlvdSBtYXkgd29yayBkaXJlY3RseSB3aXRoIHRoZSB7MH0gSmF2YSBjbGFzcy4gQnV0IHdvcmtpbmcgZnJvbSBhbiBpbnRlcmZhY2UgaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoLiBUd28gb3B0aW9ucyBhcmUgcHJvdmlkZWQgaGVyZS4pCi1KQVZBMldTX1NFTEVDVF9TRUk9U2VsZWN0IFNFSToKLSNKQVZBMldTX1NFTEVDVF9TRUlfTEFCRUw9U2VsZWN0IFNFSSBmcm9tICZUeXBlIEhpZXJhcmNoeToKLUpBVkEyV1NfU0VMRUNUX1NFSV9MQUJFTD1TZWxlYyZ0IGFuIFNFSToKLUpBVkEyV1NfU0VMRUNUX1NFSV9UT09MVElQPVNlbGVjdCB0aGUgSW50ZXJmYWNlIGZyb20gdGhlIFR5cGUgSGllcmFyY2h5IHRvIHVzZSBhcyB0aGUgU0VJCi1KQVZBMldTX0JST1dTRV9MQUJFTD1Ccm93c2UuLi4KLUpBVkEyV1NfRVhUUkFDVF9TRUk9RXh0cmFjdCBTRUk6Ci1KQVZBMldTX0VYVFJBQ1RfU0VJX0xBQkVMPSZDcmVhdGUgYW4gU0VJOgotSkFWQTJXU19FWFRSQUNUX1NFSV9UT09MVElQPVR5cGUgdGhlIG5hbWUgb2YgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIHRvIGV4dHJhY3QKLUpBVkEyV1NfRVhUUkFDVF9NRU1CRVJTX0xBQkVMPU1lbWJlcnMgdG8gZGVjbGFyZSBpbiB0aGUgZXh0cmFjdGVkIFNFSToKLUpBVkEyV1NfU0VMRUNUX0FMTF9CVVRUT049JlNlbGVjdCBBbGwuLi4KLUpBVkEyV1NfREVTRUxFQ1RfQUxMX0JVVFRPTj0mRGVzZWxlY3QgQWxsLi4uCi1KQVZBMldTX1NFTEVDVF9JTVBMRU1FTlRBVElPTj1TZWxlY3QgJkltcGxlbWVudGF0aW9uOgotSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT05fVE9PTFRJUD1TZWxlY3QgdGhlIEltcGxlbWVudGF0aW9uCi0KLVdTREwySkFWQV9GUk9OVEVORF9UT09MVElQPVNwZWNpZnkgdGhlIGZyb250ZW5kLiBEZWZhdWx0IGlzIEpBWFdTLiBDdXJyZW50bHkgc3VwcG9ydHMgb25seSBKQVhXUyBmcm9udGVuZAotV1NETDJKQVZBX0RBVEFCSU5ESU5HX1RPT0xUSVA9U3BlY2lmeSB0aGUgZGF0YWJpbmRpbmcuIERlZmF1bHQgaXMgSkFYQi4gQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgSkFYQiBkYXRhYmluZGluZwotV1NETDJKQVZBX1dTRExfVkVSU0lPTl9UT09MVElQPVNwZWNpZnkgdGhlIHdzZGwgdmVyc2lvbiAuRGVmYXVsdCBpcyBXU0RMMS4xLiBDdXJyZW50bHkgc3VwcG9ydHMgb25seSBXU0RMMS4xIHZlcnNpb24KLVdTREwySkFWQV9HRU5FUkFURV9JTVBMRU1FTlRBVElPTl9UT09MVElQPUdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9iamVjdAotV1NETDJKQVZBX0dFTkVSQVRFX0NMSUVOVF9UT09MVElQPUdlbmVyYXRlIHRoZSBjbGllbnQgY29kZQotV1NETDJKQVZBX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQPUdlbmVyYXRlIHRoZSBzZXJ2ZXIgY29kZQotV1NETDJKQVZBX0RFRkFVTFRfVkFMVUVTX1RPT0xUSVA9R2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFuZCBjbGllbnQuIElnbm9yZWQgaWYgaW1wbGVtZW50YXRpb24gb3IgY2xpZW50IGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKLVdTREwySkFWQV9FWENMVURFX05BTUVTUEFDRV9UT09MVElQPUlnbm9yZSB0aGUgc3BlY2lmaWVkIFdTREwgc2NoZW1hIG5hbWVzcGFjZXMgd2hlbiBnZW5lcmF0aW5nIGNvZGUKLVdTREwySkFWQV9QUk9DRVNTX1NPQVBfSEVBREVSU19UT09MVElQPUVuYWJsZXMgb3IgZGlzYWJsZXMgcHJvY2Vzc2luZyBvZiBleHRlbmRlZCBzb2FwIGhlYWRlciBtZXNzYWdlIGJpbmRpbmcKLVdTREwySkFWQV9ERUZBVUxUX05BTUVTUEFDRV9MT0FESU5HX1RPT0xUSVA9RW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBwYWNrYWdlIG5hbWUgbWFwcGluZwotV1NETDJKQVZBX0VYQ0xVREVfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUD1FbmFibGVzIG9yIGRpc2FibGVzIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmcKLVdTREwySkFWQV9XU0RMX0xPQ0FUSU9OX1RPT0xUSVA9U3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbidzIHdzZGxMb2NhdGlvbiBwcm9wZXJ0eQotV1NETDJKQVZBX1hNTF9DQVRBTE9HX1RPT0xUSVA9U3BlY2lmeSB0aGUgVVJMIG9mIGFuIFhNTCBjYXRhbG9nIHRvIHVzZSBmb3IgcmVzb2x2aW5nIGltcG9ydGVkIHNjaGVtYXMgYW5kIFdTREwgZG9jdW1lbnRzCi1XU0RMMkpBVkFfTk9fQUREUkVTU19CSU5ESU5HPVVzZSB0aGUgezB9IHByb3ByaWV0YXJ5IFdTLSZBZGRyZXNzaW5nIHR5cGUKLVdTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkdfVE9PTFRJUD1Vc2UgdGhlIHswfSBwcm9wcmlldGFyeSBXUy1BZGRyZXNzaW5nIHR5cGUgaW5zdGVhZCBvZiB0aGUgSkFYLVdTIDIuMSBjb21wbGlhbnQgbWFwcGluZwotV1NETDJKQVZBX0FVVE9fTkFNRV9SRVNPTFVUSU9OPUVuYWJsZSBBdXRvIE5hbWUgUmVzb2x1dGlvbgotV1NETDJKQVZBX0FVVE9fTkFNRV9SRVNPTFVUSU9OX1RPT0xUSVA9QXV0b21hdGljYWxseSByZXNvbHZlIG5hbWluZyBjb25mbGljdHMgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZSBvZiBiaW5kaW5nIGN1c3RvbWl6YXRpb25zCi1XU0RMMkpBVkFfWEpDX0FSR1NfVE9PTFRJUD1TcGVjaWZ5IHRoZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBYSkMKLVdTREwySkFWQV9YSkNfQVJHX0dST1VQX1RJVExFPVhKQyBBcmd1bWVudHMKLVdTREwySkFWQV9YSkNfQVJHX0NPTFVNTl9OQU1FPVhKQyBBcmcKLVdTREwySkFWQV9YSkNfREVTQ1JJUFRJT05fQ09MVU1OX05BTUU9RGVzY3JpcHRpb24KLVdTREwySkFWQV9YSkNfREVGQVVMVF9WQUxVRVM9SW5pdGlhbGlzZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcwotV1NETDJKQVZBX1hKQ19UT1NUUklORz1BY3RpdmF0ZSBwbHVnaW4gdG8gYWRkIGEgdG9TdHJpbmcoKSBtZXRob2QgdG8gZ2VuZXJhdGVkIGNsYXNzZXMKLVdTREwySkFWQV9YSkNfVE9TVFJJTkdfTVVMVElMSU5FPUhhdmUgdG9TdHJpbmcgcHJvZHVjZSBtdWx0aSBsaW5lIG91dHB1dAotV1NETDJKQVZBX1hKQ19UT1NUUklOR19TSU1QTEU9SGF2ZSB0b1N0cmluZyBwcm9kdWNlIHNpbmdsZSBsaW5lIHRlcnNlIG91dHB1dAotV1NETDJKQVZBX1hKQ19MT0NBVE9SPUVuYWJsZSBzb3VyY2UgbG9jYXRpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGVkIGNvZGUKLVdTREwySkFWQV9YSkNfU1lOQ19NRVRIT0RTPUdlbmVyYXRlIGFjY2Vzc29yIG1ldGhvZHMgd2l0aCB0aGUgJ3N5bmNocm9uaXplZCcga2V5d29yZAotV1NETDJKQVZBX1hKQ19NQVJLX0dFTkVSQVRFRD1BZGQgQEdlbmVyYXRlZCBhbm5vdGF0aW9ucyB0byB0aGUgZ2VuZXJhdGVkIGNvZGUKLSNNYXJrIHRoZSBnZW5lcmF0ZWQgY29kZSBhcyBAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQKLVdTREwySkFWQV9YSkNfRVBJU09ERV9GSUxFPSBHZW5lcmF0ZSB0aGUgZXBpc29kZSBmaWxlIGZvciBzZXBhcmF0ZSBjb21waWxhdGlvbgotI1Jlc291cmNlIFNlbGVjdGlvbiBEaWFsb2cKLVJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfV09SS1NQQUNFX0JVVFRPTj1Ccm93c2UgV29ya3NwYWNlLi4uCi1SRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfU1lTVEVNX0JVVFRPTj1Ccm93c2UgRmlsZSBTeXN0ZW0uLi4KLVJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfRklMRV9OT1RfRk9VTkRfRVJST1I9RmlsZSBOb3QgRm91bmQKLQotV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUlk9Jk91dHB1dCBEaXJlY3Rvcnk6Ci1XU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWV9UT09MVElQPVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgY29kZSBmaWxlcyBhcmUgd3JpdHRlbgotCi1XU0RMMkpBVkFfUEFDS0FHRV9OQU1FPSZQYWNrYWdlIE5hbWU6Ci1XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX1RPT0xUSVA9VGhlIGphdmEgcGFja2FnZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlCi0KLVdTREwySkFWQV9QQUNLQUdFX05BTUVfT1BUSU9OQUw9U3BlY2lmeSAmV1NETCBOYW1lcHNhY2UgdG8gUGFja2FnZSBOYW1lIE1hcHBpbmdzCi1XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX09QVElPTkFMX1RPT0xUSVA9T3B0aW9uYWxseSBzcGVjaWZ5IHRoZSB3c2RsIG5hbWVzcGFjZSBtYXBwaW5nIHRvIGEgcGFydGljdWxhciBqYXZhIHBhY2thZ2UgbmFtZQotCi1XU0RMMkpBVkFfV1NETF9OQU1FU1BBQ0VfQ09MVU1OX0hFQURFUj1XU0RMIE5hbWVzcGFjZQotV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9DT0xVTU5fSEVBREVSPVBhY2thZ2UgTmFtZQotCi1XU0RMMkpBVkFfU0VSVklDRV9OQU1FPSZTZXJ2aWNlIE5hbWU6Ci1XU0RMMkpBVkFfU0VSVklDRV9OQU1FX1RPT0xUSVA9U3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgV1NETCBzZXJ2aWNlIGZvciB3aGljaCBjb2RlIGlzIHRvIGJlIGdlbmVyYXRlZC4gVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgZXZlcnkgc2VydmljZSBpbiB0aGUgV1NETCBkb2N1bWVudAotCi1XU0RMMkpBVkFfQklORElOR19GSUxFUz0mQmluZGluZyBGaWxlczoKLVdTREwySkFWQV9CSU5ESU5HX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHplcm8sIG9yIG1vcmUsIEpBWFdTIG9yIEpBWEIgYmluZGluZyBmaWxlcwotV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfQUREPSZBZGQuLi4KLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVTX1JFTU9WRT0mUmVtb3ZlLi4uCi0KLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX1RJVExFPUJyb3dzZSBmb3IgQmluZGluZyBGaWxlCi1XU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19NRVNTQUdFPUJpbmRpbmcgRmlsZToKLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX0ZJTFRFUl9OQU1FPUpBWFdTIG9yIEpBWEIgQmluZGluZyBGaWxlcyAoKi54bWwpCi0KLVdTREwySkFWQV9YTUxfQ0FUTE9HPVhNTCBDYXRhbG9nOgotV1NETDJKQVZBX1hNTF9DQVRMT0dfVE9PTFRJUD1TcGVjaWZ5IGNhdGFsb2cgZmlsZSB0byBtYXAgdGhlIGltcG9ydGVkIHdzZGwvc2NoZW1hCi1XU0RMMkpBVkFfWE1MX0NBVExPR19CUk9XU0U9QnJvd3NlLi4uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvZGlhbG9ncy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL2RpYWxvZ3MvUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlZmNkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvZGlhbG9ncy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQSA8Y29kZT5TZWxlY3Rpb25TdGF0dXNEaWFsb2c8L2NvZGU+IHdoaWNoIGFsbG93cyB0aGUgc2VsZWN0aW9uIG9mIGZpbGVzCi0gKiB3aXRoIGEgc3BlY2lmaWMgZXh0ZW5zaW9uIGZyb20gdGhlIHdvcmtzcGFjZSBvciBmaWxlIHN5c3RlbS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25TdGF0dXNEaWFsb2cgewotICAgIHByaXZhdGUgSVN0YXR1cyBPS19GSUxFX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgSVN0YXR1cyBFUlJPUl9GSUxFX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5SRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfTk9UX0ZPVU5EX0VSUk9SKTsKLQotICAgIHByaXZhdGUgSVN0YXR1cyBWQUxJREFURV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBUZXh0IHJlc291cmNlVGV4dDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZpbHRlckV4dGVuc2lvbjsKLSAgICBwcml2YXRlIFN0cmluZyBmaWx0ZXJOYW1lOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZzwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogQHBhcmFtIGZpbHRlckV4dGVuc2lvbgotICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZSBleHRlbnNpb24gd2hpY2ggdGhlIGRpYWxvZ3Mgd2lsbCB1c2UgdG8gZmlsdGVyCi0gICAgICogICAgICAgICAgICBmaWxlcwotICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSB0aGF0IGRlc2NyaWJlcyB0aGUgZmlsdGVyRXh0ZW5zaW9uCi0gICAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAgICogICAgICAgICAgICB0aGUgZGlhbG9nIHRpdGxlCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIGZpbHRlckV4dGVuc2lvbiwgU3RyaW5nIGZpbHRlck5hbWUsIFN0cmluZyBkaWFsb2dUaXRsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotCi0gICAgICAgIHRoaXMuZmlsdGVyRXh0ZW5zaW9uID0gZmlsdGVyRXh0ZW5zaW9uOwotICAgICAgICB0aGlzLmZpbHRlck5hbWUgPSBmaWx0ZXJOYW1lOwotCi0gICAgICAgIHNldFRpdGxlKGRpYWxvZ1RpdGxlKTsKLSAgICAgICAgc2V0U3RhdHVzTGluZUFib3ZlQnV0dG9ucyh0cnVlKTsKLSAgICAgICAgaW50IHNoZWxsU3R5bGUgPSBnZXRTaGVsbFN0eWxlKCk7Ci0gICAgICAgIHNldFNoZWxsU3R5bGUoc2hlbGxTdHlsZSB8IFNXVC5NQVggfCBTV1QuUkVTSVpFKTsKLSAgICAgICAgdXBkYXRlU3RhdHVzKFZBTElEQVRFX1NFTEVDVElPTl9TVEFUVVMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0gICAgICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gNTAwOwotICAgICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIExhYmVsIG1lc3NhZ2VMYWJlbCA9IGNyZWF0ZU1lc3NhZ2VBcmVhKGJ1dHRvbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEJ1dHRvbiBicm93c2VXb3Jrc3BhY2UgPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICBicm93c2VXb3Jrc3BhY2Uuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfV09SS1NQQUNFX0JVVFRPTik7Ci0gICAgICAgIGJyb3dzZVdvcmtzcGFjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBjcmVhdGVXb3Jrc3BhY2VSZXNvdXJjZURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gU2VsZWN0aW9uRGlhbG9nLk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgcmVzdWx0WzBdOwotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVRleHQuc2V0VGV4dChyZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYnJvd3NlV29ya3NwYWNlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEJ1dHRvbiBicm93c2VGaWxlU3lzdGVtID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlRmlsZVN5c3RlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9GSUxFX1NZU1RFTV9CVVRUT04pOwotICAgICAgICBicm93c2VGaWxlU3lzdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgRmlsZURpYWxvZyBkaWFsb2cgPSBjcmVhdGVGaWxlU3lzdGVtUmVzb3VyY2VEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElQYXRoIGZpbHRlclBhdGggPSBuZXcgUGF0aChkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYnVpbGRGaWxlTmFtZSA9IGRpYWxvZy5nZXRGaWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBmaWx0ZXJQYXRoLmFwcGVuZChidWlsZEZpbGVOYW1lKS5tYWtlQWJzb2x1dGUoKTsKLQotICAgICAgICAgICAgICAgIHJlc291cmNlVGV4dC5zZXRUZXh0KHBhdGgudG9PU1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBicm93c2VGaWxlU3lzdGVtLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHJlc291cmNlVGV4dCA9IG5ldyBUZXh0KGJ1dHRvbkNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICByZXNvdXJjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlID0gcmVzb3VyY2VUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KEFycmF5cy5hc0xpc3QocmVzb3VyY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKE9LX0ZJTEVfU1RBVFVTKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXMoRVJST1JfRklMRV9TVEFUVVMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgcmVzb3VyY2VUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZWxlY3Rpb25EaWFsb2cgY3JlYXRlV29ya3NwYWNlUmVzb3VyY2VEaWFsb2coU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgd29ya3NwYWNlUmVzb3VyY2VEaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coc2hlbGwsCi0gICAgICAgICAgICAgICAgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLQotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5zZXRUaXRsZShnZXRNZXNzYWdlKCkpOwotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5zZXRNZXNzYWdlKGZpbHRlck5hbWUpOwotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLQotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuaXNBY2Nlc3NpYmxlKCkgJiYgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKGZpbHRlckV4dGVuc2lvbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCAmJiAhKChJUHJvamVjdCkgZWxlbWVudCkuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2plY3QuaXNBY2Nlc3NpYmxlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdCh2aWV3ZXIsIHBhcmVudEVsZW1lbnQsIHJlc291cmNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlVJUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5zZXRWYWxpZGF0b3IobmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc2VsZWN0ZWQgPSBzZWxlY3Rpb25bMF07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBzZWxlY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoZmlsdGVyRXh0ZW5zaW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPS19GSUxFX1NUQVRVUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gVkFMSURBVEVfU0VMRUNUSU9OX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgd29ya3NwYWNlUmVzb3VyY2VEaWFsb2cuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZURpYWxvZyBjcmVhdGVGaWxlU3lzdGVtUmVzb3VyY2VEaWFsb2coU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotICAgICAgICBkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKiIgKyBmaWx0ZXJFeHRlbnNpb24gfSk7IC8vJE5PTi1OTFMtMSQ7Ci0gICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJOYW1lcyhuZXcgU3RyaW5nW10geyBmaWx0ZXJOYW1lIH0pOwotICAgICAgICByZXR1cm4gZGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVSZXN1bHQoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9wcmVmZXJlbmNlcy9DWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9wcmVmZXJlbmNlcy9DWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzODE1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvcHJlZmVyZW5jZXMvQ1hGUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuQW5ub3RhdGlvbnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5DWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5DWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5KYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLlNwcmluZ0NvbmZpZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHMuQ1hGSW5zdGFsbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotcHVibGljIGNsYXNzIENYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLSAgICAvLyAgICBwcml2YXRlIElTdGF0dXMgQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCBudWxsKTsKLSAgICAvLyAgICBwcml2YXRlIElTdGF0dXMgT0tfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIC8vCi0gICAgcHJpdmF0ZSBJU2VsZWN0aW9uIHByZXZpb3VzSW5zdGFsbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZWRpdEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0KLSAgICBwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3hmSW5zdGFsbGF0aW9uczsKLQotICAgIHByaXZhdGUgQnV0dG9uIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbjsKLQotICAgIHByaXZhdGUgQ1hGQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgamF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBqYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIDsKLQotICAgIHByaXZhdGUgQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSBjeGYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQ1hGMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uc0NvbXBvc2l0ZSBhbm5vdGF0aW9uc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgU3ByaW5nQ29uZmlnQ29tcG9zaXRlIHNwcmluZ0NvbmZpZ0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgamF2YTJXU1N0YWNrTGF5b3V0OwotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgd3NkbDJqYXZhU3RhY2tMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBTdGFja0xheW91dCBqYXh3c1N0YWNrTGF5b3V0OwotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQ7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBqYXZhMldTUHJlZmVybmNlc0dyb3VwOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXA7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgamF4d3NQcmVmZXJlbmNlc0dyb3VwOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGphdmEyV1NETFByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGphdmEyV1NQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSB3c2RsMkphdmEyMFByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIHdzZGwySmF2YTIxUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBzcHJpbmdQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgamF2YTJXU0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSB3c2RsMkphdmFCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgamF4d3NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgc3ByaW5nQ29uZmlnQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgSW1hZ2UgbGlicmFyeUltYWdlOwotCi0gICAgcHVibGljIENYRlJ1bnRpbWVQcmVmZXJlbmNlUGFnZSgpIHsKLSAgICAgICAgbGlicmFyeUltYWdlID0gQ1hGVUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy9vYmoxNi9saWJyYXJ5X29iai5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBtYWluTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChtYWluTGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFRhYkZvbGRlciBjeGZQcmVmZXJlbmNlVGFiID0gbmV3IFRhYkZvbGRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgY3hmUHJlZmVyZW5jZVRhYi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvL0NYRiBSdW50aW1lIExvY2F0aW9uCi0gICAgICAgIFRhYkl0ZW0gcnVudGltZUluc3RhbExvY2F0aW9uSXRlbSA9IG5ldyBUYWJJdGVtKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLSAgICAgICAgcnVudGltZUluc3RhbExvY2F0aW9uSXRlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfSE9NRV9UQUJfTkFNRSk7Ci0gICAgICAgIHJ1bnRpbWVJbnN0YWxMb2NhdGlvbkl0ZW0uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9UT09MVElQKTsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgcnVudGltZUdyb3VwID0gbmV3IENvbXBvc2l0ZShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgcnVudGltZUluc3RhbExvY2F0aW9uSXRlbS5zZXRDb250cm9sKHJ1bnRpbWVHcm91cCk7Ci0gICAgICAgIHJ1bnRpbWVHcm91cC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX1RPT0xUSVApOwotCi0gICAgICAgIEdyaWRMYXlvdXQgcnVudGltZUxvYWN0aW9ubGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgcnVudGltZUxvYWN0aW9ubGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBydW50aW1lTG9hY3Rpb25sYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0gICAgICAgIHJ1bnRpbWVHcm91cC5zZXRMYXlvdXQocnVudGltZUxvYWN0aW9ubGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgcnVudGltZUdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIHJ1bnRpbWVUYWJEZXNjcmlwdGlvbkxhYmVsID0gbmV3IExhYmVsKHJ1bnRpbWVHcm91cCwgU1dULldSQVApOwotICAgICAgICBydW50aW1lVGFiRGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0RFU0NSSVBUSU9OX0xBQkVMKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLSAgICAgICAgcnVudGltZVRhYkRlc2NyaXB0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVGFibGUgaW5zdGFsbFRhYmxlID0gbmV3IFRhYmxlKHJ1bnRpbWVHcm91cCwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUgotICAgICAgICAgICAgICAgIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgaW5zdGFsbFRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgaW5zdGFsbFRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgICAgaW5zdGFsbFRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICAgICAgY3hmSW5zdGFsbGF0aW9ucyA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKGluc3RhbGxUYWJsZSk7Ci0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q2hlY2tlZEluc3RhbGwoZXZlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRDaGVja2VkSW5zdGFsbChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaW50IG5vRWxlbWVudHMgPSBzZWxlY3Rpb24uc2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChub0VsZW1lbnRzID4gMSkgewotICAgICAgICAgICAgICAgICAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoIXNlbGVjdGlvbi5pc0VtcHR5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgVGFibGVWaWV3ZXJDb2x1bW4gdmVyc2lvblZpZXdlckNvbHVtbiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbihjeGZJbnN0YWxsYXRpb25zLCBTV1QuTEVGVCk7Ci0gICAgICAgIHZlcnNpb25WaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gKENYRkluc3RhbGwpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gaW5zdGFsbC5nZXRUeXBlKCkudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gaW5zdGFsbC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlICsgIiAiICsgdmVyc2lvbjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpYnJhcnlJbWFnZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBUYWJsZUNvbHVtbiB2ZXJzaW9uQ29sdW1uID0gdmVyc2lvblZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgdmVyc2lvbkNvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1ZFUlNJT05fQ09MVU1OX05BTUUpOwotICAgICAgICB2ZXJzaW9uQ29sdW1uLnBhY2soKTsKLQotICAgICAgICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgNTAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIGxvY2F0aW9uVmlld2VyQ29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKGN4Zkluc3RhbGxhdGlvbnMsIFNXVC5MRUZUKTsKLSAgICAgICAgbG9jYXRpb25WaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gKENYRkluc3RhbGwpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YWxsLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBUYWJsZUNvbHVtbiBsb2NhdGlvbkNvbHVtbiA9IGxvY2F0aW9uVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICBsb2NhdGlvbkNvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0xPQ0FUSU9OX0NPTFVNTl9OQU1FKTsKLSAgICAgICAgbG9jYXRpb25Db2x1bW4ucGFjaygpOwotCi0gICAgICAgIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgMTUwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDU7Ci0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqMSBpbnN0YW5jZW9mIENYRkluc3RhbGwgJiYgb2JqMiBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ1hGSW5zdGFsbCkgb2JqMSkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkudHJpbSgpLmNvbXBhcmVUbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENYRkluc3RhbGwpIG9iajIpLmdldFZlcnNpb24oKS50b1N0cmluZygpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqMSwgb2JqMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuc2V0SW5wdXQoY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkudmFsdWVzKCkpOwotCi0gICAgICAgIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24ocnVudGltZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGFkZEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0FERF9CVVRUT05fTEFCRUwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgQ1hGSW5zdGFsbFdpemFyZCBpbnN0YWxsV2l6YXJkID0gbmV3IENYRkluc3RhbGxXaXphcmQoKTsKLSAgICAgICAgICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCBpbnN0YWxsV2l6YXJkKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBlZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihydW50aW1lR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgZWRpdEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VESVRfQlVUVE9OX0xBQkVMKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjeGZJbnN0YWxsYXRpb25zLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBDWEZJbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRkluc3RhbGxXaXphcmQgaW5zdGFsbFdpemFyZCA9IG5ldyBDWEZJbnN0YWxsV2l6YXJkKChDWEZJbnN0YWxsKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCBpbnN0YWxsV2l6YXJkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihydW50aW1lR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUkVNT1ZFX0JVVFRPTl9MQUJFTCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN4Zkluc3RhbGxhdGlvbnMuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgSXRlcmF0b3I8Q1hGSW5zdGFsbD4gaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IGluc3RhbGxhdGlvbnMgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnMucmVtb3ZlKGluc3RhbGwuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbnN0YWxsYXRpb25zKGluc3RhbGxhdGlvbnMpOwotICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxhdGlvbnMucmVmcmVzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIExhYmVsIHBhZGRpbmdMYWJlbCA9IG5ldyBMYWJlbChydW50aW1lR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHBhZGRpbmdMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24gPSBuZXcgQnV0dG9uKHJ1bnRpbWVHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSKTsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkpOwotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vSmF2YTJXUwotICAgICAgICBUYWJJdGVtIGphdmEyV1NUYWJJdGVtID0gbmV3IFRhYkl0ZW0oY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotICAgICAgICBqYXZhMldTVGFiSXRlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfTkFNRSk7Ci0gICAgICAgIGphdmEyV1NUYWJJdGVtLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUCk7Ci0KLSAgICAgICAgamF2YTJXU1ByZWZlcm5jZXNHcm91cCA9IG5ldyBDb21wb3NpdGUoY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotCi0gICAgICAgIGphdmEyV1NTdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotICAgICAgICBqYXZhMldTUHJlZmVybmNlc0dyb3VwLnNldExheW91dChqYXZhMldTU3RhY2tMYXlvdXQpOwotCi0gICAgICAgIGphdmEyV1NETFByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShqYXZhMldTUHJlZmVybmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgamF2YTJXU0dyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgamF2YTJXU0RMUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KGphdmEyV1NHcmlkTGF5b3V0KTsKLQotICAgICAgICBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKAotICAgICAgICAgICAgICAgIGphdmEyV1NETFByZWZlcmVuY2VzQ29tcG9zaXRlLCBTV1QuTk9ORSwgY3hmUHJlZmVyZW5jZVRhYik7Ci0gICAgICAgIGphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5hZGRDb250cm9scygpOwotCi0gICAgICAgIGphdmEyV1NQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoamF2YTJXU1ByZWZlcm5jZXNHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGphdmEyV1NETEdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgamF2YTJXU1ByZWZlcmVuY2VzQ29tcG9zaXRlLnNldExheW91dChqYXZhMldTRExHcmlkTGF5b3V0KTsKLQotICAgICAgICBqYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IEphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoCi0gICAgICAgICAgICAgICAgamF2YTJXU1ByZWZlcmVuY2VzQ29tcG9zaXRlLCBTV1QuTk9ORSwgY3hmUHJlZmVyZW5jZVRhYik7Ci0gICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuYWRkQ29udHJvbHMoKTsKLQotICAgICAgICBqYXZhMldTQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShqYXZhMldTUHJlZmVybmNlc0dyb3VwLAotICAgICAgICAgICAgICAgIFNXVC5OT05FKTsKLQotICAgICAgICBqYXZhMldTVGFiSXRlbS5zZXRDb250cm9sKGphdmEyV1NQcmVmZXJuY2VzR3JvdXApOwotCi0gICAgICAgIC8vV1NETDJKYXZhCi0gICAgICAgIFRhYkl0ZW0gd3NkbDJKYXZhVGFiSXRlbSA9IG5ldyBUYWJJdGVtKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLSAgICAgICAgd3NkbDJKYXZhVGFiSXRlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9OQU1FKTsKLSAgICAgICAgd3NkbDJKYXZhVGFiSXRlbS5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUCk7Ci0KLSAgICAgICAgd3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cCA9IG5ldyBDb21wb3NpdGUoY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotCi0gICAgICAgIHdzZGwyamF2YVN0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YVN0YWNrTGF5b3V0KTsKLQotICAgICAgICB3c2RsMkphdmEyMFByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbDJKYXZhMjBHcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHdzZGwySmF2YTIwUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KHdzZGwySmF2YTIwR3JpZExheW91dCk7Ci0KLSAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlKAotICAgICAgICAgICAgICAgIHdzZGwySmF2YTIwUHJlZmVyZW5jZXNDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5hZGRDb250cm9scygpOwotCi0gICAgICAgIHdzZGwySmF2YTIxUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMkphdmEyMUdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJKYXZhMjFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXRMYXlvdXQod3NkbDJKYXZhMjFHcmlkTGF5b3V0KTsKLQotICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUoCi0gICAgICAgICAgICAgICAgd3NkbDJKYXZhMjFQcmVmZXJlbmNlc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmFkZENvbnRyb2xzKCk7Ci0KLSAgICAgICAgd3NkbDJKYXZhQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSh3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwLAotICAgICAgICAgICAgICAgIFNXVC5OT05FKTsKLQotICAgICAgICB3c2RsMkphdmFUYWJJdGVtLnNldENvbnRyb2wod3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cCk7Ci0KLSAgICAgICAgLy9KQVgtV1MKLSAgICAgICAgVGFiSXRlbSBhbm5vdGF0aW9uc1RhYkl0ZW0gPSBuZXcgVGFiSXRlbShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0gICAgICAgIGFubm90YXRpb25zVGFiSXRlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX05BTUUpOwotICAgICAgICBhbm5vdGF0aW9uc1RhYkl0ZW0uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUCk7Ci0KLSAgICAgICAgamF4d3NQcmVmZXJlbmNlc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0KLSAgICAgICAgamF4d3NTdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotICAgICAgICBqYXh3c1ByZWZlcmVuY2VzR3JvdXAuc2V0TGF5b3V0KGpheHdzU3RhY2tMYXlvdXQpOwotCi0gICAgICAgIGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGpheHdzUHJlZmVyZW5jZXNHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGpheHdzR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXh3c1ByZWZlcmVuY2VzQ29tcG9zaXRlLnNldExheW91dChqYXh3c0dyaWRMYXlvdXQpOwotICAgICAgICBhbm5vdGF0aW9uc0NvbXBvc2l0ZSA9IG5ldyBBbm5vdGF0aW9uc0NvbXBvc2l0ZShqYXh3c1ByZWZlcmVuY2VzQ29tcG9zaXRlLCAgU1dULlNIQURPV19JTik7Ci0KLSAgICAgICAgamF4d3NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKGpheHdzUHJlZmVyZW5jZXNHcm91cCwKLSAgICAgICAgICAgICAgICBTV1QuTk9ORSk7Ci0KLSAgICAgICAgYW5ub3RhdGlvbnNUYWJJdGVtLnNldENvbnRyb2woamF4d3NQcmVmZXJlbmNlc0dyb3VwKTsKLQotICAgICAgICAvL1NwcmluZyBDb25maWcKLSAgICAgICAgVGFiSXRlbSBzcHJpbmdDb25maWdUYWJJdGVtID0gbmV3IFRhYkl0ZW0oY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotICAgICAgICBzcHJpbmdDb25maWdUYWJJdGVtLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5TUFJJTkdfQ09ORklHX1BSRUZFUkVOQ0VTX1RBQl9OQU1FKTsKLSAgICAgICAgc3ByaW5nQ29uZmlnVGFiSXRlbS5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLlNQUklOR19DT05GSUdfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVApOwotCi0gICAgICAgIHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cCA9IG5ldyBDb21wb3NpdGUoY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotCi0gICAgICAgIHNwcmluZ0NvbmZpZ1N0YWNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cC5zZXRMYXlvdXQoc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQpOwotCi0gICAgICAgIHNwcmluZ1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBzcHJpbmdHcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHNwcmluZ1ByZWZlcmVuY2VzQ29tcG9zaXRlLnNldExheW91dChzcHJpbmdHcmlkTGF5b3V0KTsKLSAgICAgICAgc3ByaW5nQ29uZmlnQ29tcG9zaXRlID0gbmV3IFNwcmluZ0NvbmZpZ0NvbXBvc2l0ZShzcHJpbmdQcmVmZXJlbmNlc0NvbXBvc2l0ZSwgU1dULlNIQURPV19JTik7Ci0KLSAgICAgICAgc3ByaW5nQ29uZmlnQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXAsCi0gICAgICAgICAgICAgICAgU1dULk5PTkUpOwotCi0gICAgICAgIHNwcmluZ0NvbmZpZ1RhYkl0ZW0uc2V0Q29udHJvbChzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXApOwotCi0gICAgICAgIENYRkluc3RhbGwgc2VsZWN0ZWQgPSBnZXRTZWxlY3RlZEluc3RhbGwoKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlUHJlZmVyZW5jZUNvbnRyb2xzKCk7Ci0KLSAgICAgICAgY29tcG9zaXRlLnBhY2soKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkluc3RhbGwgZ2V0U2VsZWN0ZWRJbnN0YWxsKCkgewotICAgICAgICBDb2xsZWN0aW9uPENYRkluc3RhbGw+IHNldCA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpLnZhbHVlcygpOwotICAgICAgICBJdGVyYXRvcjxDWEZJbnN0YWxsPiBzZXRJdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoc2V0SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBDWEZJbnN0YWxsIGVudHJ5ID0gc2V0SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZlcnNpb24oKS50b1N0cmluZygpLnRyaW0oKS5lcXVhbHMoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldENoZWNrZWRJbnN0YWxsKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5lcXVhbHMocHJldmlvdXNJbnN0YWxsKSkgewotICAgICAgICAgICAgICAgIHByZXZpb3VzSW5zdGFsbCA9IHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gKENYRkluc3RhbGwpIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnNldENoZWNrZWRFbGVtZW50cyhuZXcgT2JqZWN0W117IGluc3RhbGwgfSk7Ci0gICAgICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxhdGlvbnMucmV2ZWFsKGluc3RhbGwpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERlZmF1bHRSdW50aW1lVmVyc2lvbihpbnN0YWxsLmdldFZlcnNpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbihpbnN0YWxsLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERlZmF1bHRSdW50aW1lVHlwZShpbnN0YWxsLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZVByZWZlcmVuY2VDb250cm9scygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVByZWZlcmVuY2VDb250cm9scygpIHsKLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpLmVxdWFscygiIikgfHwgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgamF2YTJXU1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBqYXZhMldTQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHdzZGwyamF2YVN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSB3c2RsMkphdmFCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgamF4d3NTdGFja0xheW91dC50b3BDb250cm9sID0gamF4d3NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHNwcmluZ0NvbmZpZ0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIGphdmEyV1NTdGFja0xheW91dC50b3BDb250cm9sID0gamF2YTJXU1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgd3NkbDJqYXZhU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHdzZGwySmF2YTIxUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICBqYXh3c1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBqYXh3c1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHNwcmluZ1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamF2YTJXU1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBqYXZhMldTRExQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHdzZGwyamF2YVN0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSB3c2RsMkphdmEyMFByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgamF4d3NTdGFja0xheW91dC50b3BDb250cm9sID0gamF4d3NQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBzcHJpbmdQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgfQotICAgICAgICBqYXZhMldTUHJlZmVybmNlc0dyb3VwLmxheW91dCgpOwotICAgICAgICB3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwLmxheW91dCgpOwotICAgICAgICBqYXh3c1ByZWZlcmVuY2VzR3JvdXAubGF5b3V0KCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ1ByZWZlcm5jZXNHcm91cC5sYXlvdXQoKTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIC8vICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXMoKSB7Ci0gICAgLy8gICAgICAgIC8vICAgIENYRl9MT0NBVElPTl9TVEFUVVMgPSBjaGVja1J1bnRpbWVFeGlzdChjeGZIb21lRGlyVGV4dC5nZXRUZXh0KCkpOwotICAgIC8vICAgICAgICBhcHBseVN0YXR1c1RvUGFnZShmaW5kTW9zdFNldmVyZSgpKTsKLSAgICAvLyAgICB9Ci0KLSAgICAvLyAgICBwcml2YXRlIHZvaWQgYXBwbHlTdGF0dXNUb1BhZ2UoSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAvLyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotICAgIC8vICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPiBJU3RhdHVzLk9LKSB7Ci0gICAgLy8gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgLy8gICAgICAgIH0gZWxzZSB7Ci0gICAgLy8gICAgICAgICAgICBzZXRNZXNzYWdlKGdldFRpdGxlKCkpOwotICAgIC8vICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIC8vICAgICAgICB9Ci0gICAgLy8KLSAgICAvLyAgICB9Ci0gICAgLy8KLSAgICAvLyAgICBwcml2YXRlIElTdGF0dXMgZmluZE1vc3RTZXZlcmUoKSB7Ci0gICAgLy8gICAgICAgIHJldHVybiBDWEZfTE9DQVRJT05fU1RBVFVTOwotICAgIC8vICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSKSk7Ci0KLSAgICAgICAgamF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0RGVmYXVsdHMoKTsKLSAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXREZWZhdWx0cygpOwotICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIGFubm90YXRpb25zQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ0NvbXBvc2l0ZS5zZXREZWZhdWx0cygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBpZiAoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUucmVmcmVzaCgpOwotICAgICAgICAgICAgY3hmMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUucmVmcmVzaCgpOwotICAgICAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGNvbnRleHQuc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICBqYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLnN0b3JlVmFsdWVzKCk7Ci0gICAgICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLnN0b3JlVmFsdWVzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICAgICAgICAgIGN4ZjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBhbm5vdGF0aW9uc0NvbXBvc2l0ZS5zdG9yZVZhbHVlcygpOwotICAgICAgICBzcHJpbmdDb25maWdDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0gICAgICAgIHN1cGVyLnBlcmZvcm1BcHBseSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5wZXJmb3JtQ2FuY2VsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotICAgICAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICAgICAgc2V0RGVmYXVsdHMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgICAgIHN0b3JlVmFsdWVzKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYgKGxpYnJhcnlJbWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaWJyYXJ5SW1hZ2UuZGlzcG9zZSgpOwotICAgICAgICAgICAgbGlicmFyeUltYWdlID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9wcm9wZXJ0aWVzL0NYRlByb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3Byb3BlcnRpZXMvQ1hGUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZjhiZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3Byb3BlcnRpZXMvQ1hGUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnByb3BlcnRpZXM7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ2xhc3NwYXRoQ29udGFpbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7DQotDQotcHVibGljIGNsYXNzIENYRlByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7DQotDQotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0Ow0KLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7DQotICAgIHByaXZhdGUgQ29tYm9WaWV3ZXIgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyOw0KLSAgICBwcml2YXRlIExpbmsgbGluazsNCi0gICAgcHJpdmF0ZSBDWEZJbnN0YWxsIGRlZmF1bHRJbnN0YWxsOw0KLSAgICBwcml2YXRlIENYRkNvbnRleHQgY29udGV4dDsNCi0NCi0gICAgcHVibGljIENYRlByb3BlcnR5UGFnZSgpIHsNCi0gICAgICAgIGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7DQotICAgICAgICBJQWRhcHRhYmxlIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7DQotDQotICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBlbGVtZW50Ow0KLSAgICAgICAgdGhpcy5wcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOw0KLQ0KLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQotDQotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7DQotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOw0KLQ0KLSAgICAgICAgbGluayA9IG5ldyBMaW5rKGNvbXBvc2l0ZSwgU1dULk5PTkUpOw0KLSAgICAgICAgbGluay5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX0NPTkZJR1VSRV9JTlNUQUxMRURfUlVOVElNRVNfTEFCRUwpOw0KLSAgICAgICAgbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSIsIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UifSwgbnVsbCkub3BlbigpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7DQotICAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIucmVmcmVzaCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOw0KLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOw0KLSAgICAgICAgbGluay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0NCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOw0KLSAgICAgICAgbGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9QUk9QRVJUWV9QQUdFX1JVTlRJTUVfTEFCRUwpOw0KLQ0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOw0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7DQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0NCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgew0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgew0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbjw/Pikgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgew0KLQ0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IChDWEZJbnN0YWxsKSBlbGVtZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGwuZ2V0VHlwZSgpICsgIiAiICsgY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBDb2xsZWN0aW9uPENYRkluc3RhbGw+IGluc3RhbGxhdGlvbnMgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS52YWx1ZXMoKTsNCi0NCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRJbnB1dChpbnN0YWxsYXRpb25zKTsNCi0NCi0gICAgICAgIFN0cmluZyBpbnRhbGxlZFZlcnNpb24gPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDWEZSdW50aW1lVmVyc2lvbihwcm9qZWN0KTsNCi0gICAgICAgIGRlZmF1bHRJbnN0YWxsID0gY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkuZ2V0KGludGFsbGVkVmVyc2lvbik7DQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRlZmF1bHRJbnN0YWxsKSwgdHJ1ZSk7DQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7DQotICAgICAgICBDWEZJbnN0YWxsIHNlbGVjdGVkSW5zdGFsbCA9IGdldFNlbGVjdGVkSW5zdGFsbCgpOw0KLSAgICAgICAgaWYgKCFkZWZhdWx0SW5zdGFsbC5nZXRWZXJzaW9uKCkuZXF1YWxzKHNlbGVjdGVkSW5zdGFsbC5nZXRWZXJzaW9uKCkpKSB7DQotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q1hGUnVudGltZVZlcnNpb24ocHJvamVjdCwgc2VsZWN0ZWRJbnN0YWxsLmdldFZlcnNpb24oKSk7DQotDQotICAgICAgICAgICAgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcigNCi0gICAgICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfSUQpOw0KLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIElQYXRoIGNvbnRhaW5lclBhdGggPSBuZXcgUGF0aChDWEZDb3JlUGx1Z2luLkNYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0lEKTsNCi0gICAgICAgICAgICAgICAgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyIGN4ZkNsYXNzcGF0aENvbnRhaW5lciA9IG5ldyBDWEZDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QpOw0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIucmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShjb250YWluZXJQYXRoLCBqYXZhUHJvamVjdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3hmQ2xhc3NwYXRoQ29udGFpbmVyKTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgew0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDWEZJbnN0YWxsIGdldFNlbGVjdGVkSW5zdGFsbCgpIHsNCi0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7DQotICAgICAgICBDWEZJbnN0YWxsIHNlbGVjdGVkSW5zdGFsbCA9IChDWEZJbnN0YWxsKSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkSW5zdGFsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgew0KLSAgICAgICAgQ1hGSW5zdGFsbCBkZWZhdWx0SW5zdGFsbCA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpLmdldChjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKTsNCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmYXVsdEluc3RhbGwpLCB0cnVlKTsNCi0gICAgICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL0phdmFWaWV3ZXJGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL0phdmFWaWV3ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0MDAwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9KYXZhVmlld2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci0KLS8qKgotICogPGNvZGU+Vmlld2VyRmlsdGVyPC9jb2RlPiB0aGF0IGZpbHRlcnMgb24gY2xhc3NlcyBvciBpbnRlcmZhY2VzIHdpdGhpbiBhIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotICAgIHByaXZhdGUgaW50IGVsZW1lbnRLaW5kczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkphdmFWaWV3ZXJGaWx0ZXI8L2NvZGU+IGdpdmVuIGEgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPiBhbmQgYW4KLSAgICAgKiA8Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50czwvY29kZT4gZWxlbWVudCBraW5kIHRvIHNlYXJjaCBmb3IuIEFsbCBvdGhlciBlbGVtZW50cyBhcmUgZmlsdGVyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBqYXZhIHByb2plY3QgdG8gZmlsdGVyCi0gICAgICogQHBhcmFtIGVsZW1lbnRLaW5kcyBhIGZsYWcgZGVmaW5pbmcgbmF0dXJlIG9mIHNlYXJjaGVkIGVsZW1lbnRzOyB0aGUgb25seSB2YWxpZCB2YWx1ZXMgYXJlOiAKLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1M8L2NvZGU+Ci0gICAgICogIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRTwvY29kZT4KLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfQU5EX0lOVEVSRkFDRTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSmF2YVZpZXdlckZpbHRlcihJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGludCBlbGVtZW50S2luZHMpIHsKLSAgICAgICAgdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotICAgICAgICB0aGlzLmVsZW1lbnRLaW5kcyA9IGVsZW1lbnRLaW5kczsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmFQcm9qZWN0LmVxdWFscygoSUphdmFQcm9qZWN0KSBlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50OwotICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VGcmFnbWVudC5oYXNDaGlsZHJlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gY29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoZWxlbWVudEtpbmRzKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDbGFzcygpOwotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0ludGVyZmFjZSgpICYmICF0eXBlLmlzQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfQU5EX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDbGFzcygpIHx8ICh0eXBlLmlzSW50ZXJmYWNlKCkgJiYgIXR5cGUuaXNBbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjA2NzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgewotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlZE5hbWVzcGFjZXM7Ci0KLSAgICBwdWJsaWMgUGFja2FnZU5hbWVDb2x1bW5MYWJlbFByb3ZpZGVyKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMgPSBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGluY2x1ZGVkTmFtZXNwYWNlcy5jb250YWluc0tleShlbGVtZW50LnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5jbHVkZWROYW1lc3BhY2VzLmdldChlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjU3ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkVkaXRpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1wdWJsaWMgY2xhc3MgUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydCBleHRlbmRzIEVkaXRpbmdTdXBwb3J0IGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotICAgIHByaXZhdGUgQ2VsbEVkaXRvciBwYWNrYWdlTmFtZUNlbGxFZGl0b3I7Ci0gICAgcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZWROYW1lc3BhY2VzOwotCi0gICAgcHVibGljIFBhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQoVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIsIENlbGxFZGl0b3IgcGFja2FnZU5hbWVDZWxsRWRpdG9yLAotICAgICAgICAgICAgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKHRhYmxlVmlld2VyKTsKLSAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgICAgIHRoaXMucGFja2FnZU5hbWVDZWxsRWRpdG9yID0gcGFja2FnZU5hbWVDZWxsRWRpdG9yOwotICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMgPSBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRWRpdChPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uKClbMF0uZ2V0Q2hlY2tlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lQ2VsbEVkaXRvcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChpbmNsdWRlZE5hbWVzcGFjZXMuY29udGFpbnNLZXkoZWxlbWVudC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVkTmFtZXNwYWNlcy5nZXQoZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZShlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCBuYW1lc3BhY2UsIE9iamVjdCBwYWNrYWdlTmFtZSkgewotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgcGFja2FnZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5jbHVkZWROYW1lc3BhY2VzLnB1dChuYW1lc3BhY2UudG9TdHJpbmcoKSwgcGFja2FnZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBnZXRWaWV3ZXIoKS51cGRhdGUobmFtZXNwYWNlLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlS2V5ID0gaXRlbS5nZXRUZXh0KDApOwotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gaXRlbS5nZXRUZXh0KDEpOwotICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlZE5hbWVzcGFjZXMuY29udGFpbnNLZXkobmFtZXNwYWNlS2V5KSkgewotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMucHV0KG5hbWVzcGFjZUtleSwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkTmFtZXNwYWNlcy5jb250YWluc0tleShuYW1lc3BhY2VLZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkTmFtZXNwYWNlcy5yZW1vdmUobmFtZXNwYWNlS2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljYjZlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZVRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgIExpc3Q8T2JqZWN0PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRGVmaW5pdGlvbikgewotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGlucHV0RWxlbWVudDsKLSAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIHZhbHVlcyA9IG5hbWVzcGFjZXMudmFsdWVzKCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBuYW1lc3BhY2VWYWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBuYW1lc3BhY2VWYWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGlmICghbmFtZXNwYWNlLmVxdWFscyhkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSAmJiAhZWxlbWVudHMuY29udGFpbnMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkobmV3IE9iamVjdFtlbGVtZW50cy5zaXplKCldKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQW5ub3RhdGlvbnNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0Fubm90YXRpb25zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYjA5NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQW5ub3RhdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5KYXZhMldTUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBwcml2YXRlIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlV2ViUGFyYW1CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGVuYWJsZUFQVEJ1dHRvbjsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIGFkZENvbnRyb2xzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICBHcmlkTGF5b3V0IHByZWZsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQocHJlZmxheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgamF4d3NBbm5vdGF0aW9uc0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICBqYXh3c0Fubm90YXRpb25zR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0FOTk9UQVRJT05TX0dST1VQX0xBQkVMKTsKLSAgICAgICAgamF4d3NBbm5vdGF0aW9uc0dyb3VwLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfQU5OT1RBVElPTlNfR1JPVVBfVE9PTFRJUCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXh3c0Fubm90YXRpb25zR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgamF4d3NBbm5vdGF0aW9uc0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uID0gbmV3IEJ1dHRvbihqYXh3c0Fubm90YXRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19HRU5FUkFURV9XRUJfTUVUSE9EKTsKLSAgICAgICAgZ2VuZXJhdGVXZWJNZXRob2RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpKTsKLQotICAgICAgICBnZW5lcmF0ZVdlYlBhcmFtQnV0dG9uID0gbmV3IEJ1dHRvbihqYXh3c0Fubm90YXRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1CdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0dFTkVSQVRFX1dFQl9QQVJBTSk7Ci0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpKTsKLQotICAgICAgICBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQnV0dG9uID0gbmV3IEJ1dHRvbihqYXh3c0Fubm90YXRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUik7Ci0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpKTsKLQotICAgICAgICBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbiA9IG5ldyBCdXR0b24oamF4d3NBbm5vdGF0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUik7Ci0gICAgICAgIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSk7Ci0KLSAgICAgICAgR3JvdXAgYW5ub3RhdGlvblByb2Nlc3NpbmdHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NpbmdHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfQU5OT1RBVElPTlNfUFJPQ0VTU0lOR19HUk9VUF9MQUJFTCk7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzaW5nR3JvdXAuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19UT09MVElQLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc2luZ0dyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzaW5nR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZW5hYmxlQVBUQnV0dG9uID0gbmV3IEJ1dHRvbihhbm5vdGF0aW9uUHJvY2Vzc2luZ0dyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBlbmFibGVBUFRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkcpOwotICAgICAgICBlbmFibGVBUFRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZChzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBlbmFibGVBUFRCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04pKTsKLQotICAgICAgICBlbmFibGVBUFRCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoZW5hYmxlQVBUQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9CbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlNDFmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9CbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotcHVibGljIGNsYXNzIEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotICAgIHB1YmxpYyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0KLSAgICAgICAgYWRkQ29udHJvbHMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBDTGFiZWwgc2V0SW50YWxsRGlyTGFiZWwgPSBuZXcgQ0xhYmVsKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIHNldEludGFsbERpckxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBzZXRJbnRhbGxEaXJMYWJlbC5zZXRJbWFnZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKAotICAgICAgICAgICAgICAgIElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKSk7Ci0gICAgICAgIHNldEludGFsbERpckxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9OT1RfU0VUKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZDljOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9DWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBDWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBXU0RMMkphdmFDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVNlcnZlckJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbjsKLQotICAgIHByaXZhdGUgVGFibGUgeGpjQXJnc1RhYmxlOwotCi0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNMb2NhdG9yVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW07Ci0KLSAgICBwdWJsaWMgQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgcHJlZmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dChwcmVmbGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCB3c2RsMmphdmFHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbDJqYXZhbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dCh3c2RsMmphdmFsYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbigKLSAgICAgICAgICAgICAgICB3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVEZWZhdWx0VmFsdWVzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLQotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbih3c2RsMmphdmFHcm91cCwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLQotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotCi0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKAotICAgICAgICAgICAgICAgIHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChDWEZNb2RlbFV0aWxzLmlzQXV0b05hbWVSZXNvbHV0aW9uUGVybWl0dGVkKCkpIHsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uKHdzZGwyamF2YUdyb3VwLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEdyb3VwIHhqY0FyZ0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB4amNBcmdHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfVElUTEUpOwotICAgICAgICBHcmlkTGF5b3V0IHhqY0FyZ0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXQoeGpjQXJnTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHhqY0FyZ3NUYWJsZSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDQXJnVGFibGUoeGpjQXJnR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDY7Ci0gICAgICAgIHhqY0FyZ3NUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNEZWZhdWx0VmFsdWVzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICAgICAgeGpjVG9TdHJpbmdUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSgKLSAgICAgICAgICAgICAgICB4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICB4amNMb2NhdG9yVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNTeW5jTWV0aG9kc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNNYXJrR2VuZXJhdGVkVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkNYRl9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUikpOwotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTikpOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTKSk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcpKTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORykpOwotCi0gICAgICAgIGlmIChjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSkgewotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19BVVRPX05BTUVfUkVTT0xVVElPTikpOwotICAgICAgICB9Ci0KLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkcpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRSkpOwotICAgICAgICB4amNMb2NhdG9yVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUikpOwotICAgICAgICB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFMpKTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1Byb2Nlc3NTT0FQSGVhZGVycygpKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpKTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNUb1N0cmluZygpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpOwotICAgICAgICB4amNMb2NhdG9yVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY0xvY2F0b3IoKSk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1N5bmNNZXRob2RzKCkpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY01hcmtHZW5lcmF0ZWQoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBjb250ZXh0LnNldFVzZURlZmF1bHRWYWx1ZXModXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcobmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNvbnRleHQuc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyh4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjVG9TdHJpbmcoeGpjVG9TdHJpbmdUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNUb1N0cmluZ011bHRpTGluZSh4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1RvU3RyaW5nU2ltcGxlKHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjTG9jYXRvcih4amNMb2NhdG9yVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjU3luY01ldGhvZHMoeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNNYXJrR2VuZXJhdGVkKHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbiAhPSBudWxsICYmIENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyY2IzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9DWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBDWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBXU0RMMkphdmFDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVNlcnZlckJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b247Ci0KLSAgICBwcml2YXRlIFRhYmxlIHhqY0FyZ3NUYWJsZTsKLQotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjVG9TdHJpbmdUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjTG9jYXRvclRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdXNlRGVmYXVsdFZhbHVlc0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBub0FkZHJlc3NCaW5kaW5nQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbjsKLQotICAgIHB1YmxpYyBDWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBwcmVmbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHdzZGwyamF2YUdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMmphdmFsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dCh3c2RsMmphdmFsYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gRnJvbnRlbmQKLSAgICAgICAgLy8gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZExhYmVsKHdzZGwyamF2YUdyb3VwKTsKLSAgICAgICAgLy8gQ29tYm8gZnJvbnRlbmRDb21ibyA9Ci0gICAgICAgIC8vIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRnJvbnRlbmRDb21ibyh3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIC8vIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAvLyBmcm9udGVuZENvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIERhdGFiaW5kaW5nCi0gICAgICAgIC8vIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGF0YWJpbmRpbmdMYWJlbCh3c2RsMmphdmFHcm91cCk7Ci0gICAgICAgIC8vIENvbWJvIGRhdGFiaW5kaW5nQ29tYm8gPQotICAgICAgICAvLyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZURhdGFiaW5kaW5nQ29tYm8od3NkbDJqYXZhR3JvdXAsCi0gICAgICAgIC8vIGNvbnRleHQpOwotICAgICAgICAvLyBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgLy8gZGF0YWJpbmRpbmdDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBXU0RMIFZlcnNpb24KLSAgICAgICAgLy8gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS4gY3JlYXRlV1NETFZlcnNpb25MYWJlbCh3c2RsMmphdmFHcm91cCk7Ci0gICAgICAgIC8vIENvbWJvIHdzZGxWZXJzaW9uQ29tYm8gPQotICAgICAgICAvLyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExWZXJzaW9uQ29tYm8od3NkbDJqYXZhR3JvdXAsCi0gICAgICAgIC8vIGNvbnRleHQpOwotICAgICAgICAvLyBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgLy8gd3NkbFZlcnNpb25Db21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uKAotICAgICAgICAgICAgICAgIHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVEZWZhdWx0VmFsdWVzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKHdzZGwyamF2YUdyb3VwLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKAotICAgICAgICAgICAgICAgIHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVFeGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5vQWRkcmVzc0JpbmRpbmdCdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgR3JvdXAgeGpjQXJnR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9USVRMRSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgeGpjQXJnTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dCh4amNBcmdMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgeGpjQXJnc1RhYmxlID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNBcmdUYWJsZSh4amNBcmdHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtKAotICAgICAgICAgICAgICAgIHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0xvY2F0b3JUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLSAgICAgICAgCi0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORykpOwotCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIpKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OKSk7Ci0gICAgICAgIAotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTKSk7Ci0gICAgICAgIAotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HKSk7Ci0gICAgICAgIAotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HKSk7Ci0KLSAgICAgICAgaWYgKGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpKSB7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTKSk7Ci0gICAgICAgIAotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORykpOwotICAgICAgICAKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEUpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SKSk7Ci0gICAgICAgIAotICAgICAgICB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFMpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTUFSS19HRU5FUkFURUQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNOb0FkZHJlc3NCaW5kaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpKSB7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNBdXRvTmFtZVJlc29sdXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkpOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNQcm9jZXNzU09BUEhlYWRlcnMoKSk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkpOwotCi0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVG9TdHJpbmcoKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNUb1N0cmluZ1NpbXBsZSgpKTsKLSAgICAgICAgeGpjTG9jYXRvclRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNMb2NhdG9yKCkpOwotICAgICAgICB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNTeW5jTWV0aG9kcygpKTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNNYXJrR2VuZXJhdGVkKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdG9yZVZhbHVlcygpIHsKLSAgICAgICAgY29udGV4dC5zZXRVc2VEZWZhdWx0VmFsdWVzKHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldE5vQWRkcmVzc0JpbmRpbmcobm9BZGRyZXNzQmluZGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcobmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgICAgY29udGV4dC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNUb1N0cmluZyh4amNUb1N0cmluZ1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjVG9TdHJpbmdTaW1wbGUoeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNMb2NhdG9yKHhqY0xvY2F0b3JUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNTeW5jTWV0aG9kcyh4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY01hcmtHZW5lcmF0ZWQoeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkgewotICAgICAgICByZXR1cm4gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uICE9IG51bGwgJiYgQ1hGTW9kZWxVdGlscy5pc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiNWVhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5KYXZhMldTUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLQotcHVibGljIGNsYXNzIEphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgcHJpdmF0ZSBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIENvbWJvIHNvYXBCaW5kaW5nQ29tYm87Ci0gICAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlWFNESW1wb3J0c0J1dHRvbjsgICAgCi0gICAgcHJpdmF0ZSBUYWJGb2xkZXIgdGFiRm9sZGVyOwotICAgIAotICAgIHB1YmxpYyBKYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICB0aGlzLnRhYkZvbGRlciA9IHRhYkZvbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBwcmVmbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIGphdmEyd3NkbEdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICBqYXZhMndzZGxHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU0RMX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCBqYXZhMndzbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgamF2YTJ3c2xheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgamF2YTJ3c2RsR3JvdXAuc2V0TGF5b3V0KGphdmEyd3NsYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgamF2YTJ3c2RsR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmRpbmdMYWJlbChqYXZhMndzZGxHcm91cCk7Ci0KLSAgICAgICAgc29hcEJpbmRpbmdDb21ibyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNPQVBCaW5nQ29tYm8oamF2YTJ3c2RsR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVYU0RJbXBvcnRzQnV0dG9uKGphdmEyd3NkbEdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgTGluayBsaW5rID0gbmV3IExpbmsodGhpcywgU1dULk5PTkUpOwotICAgICAgICBsaW5rLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19QUkVGRVJFTkNFU19MSU5LKTsKLSAgICAgICAgbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDMpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICBpZiAoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HKSkgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4xIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUykpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBpZiAoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSkgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMiIpOyAvLyROT04tTkxTLTEkICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlWFNESW1wb3J0cygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ0NvbWJvLmdldFRleHQoKS5lcXVhbHMoIlNPQVAgMS4yIikpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyhmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlWFNESW1wb3J0cyhjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNjJmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LkphdmEyV1NQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgcHJpdmF0ZSBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBDb21ibyBzb2FwQmluZGluZ0NvbWJvOwotICAgIHByaXZhdGUgQnV0dG9uIGNyZWF0ZVhTREltcG9ydHNCdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZUNsaWVudEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVNlcnZlckJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVXU0RMQnV0dG9uOwotICAgIAotICAgIHByaXZhdGUgVGFiRm9sZGVyIHRhYkZvbGRlcjsKLSAgICAKLSAgICBwdWJsaWMgSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIHRoaXMudGFiRm9sZGVyID0gdGFiRm9sZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICBHcmlkTGF5b3V0IHByZWZsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCi0gICAgICAgIHByZWZsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIHByZWZsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBKYXZhMldTIEdyb3VwCi0gICAgICAgIEdyb3VwIGphdmEyd3NHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgamF2YTJ3c0dyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCBqYXZhMndzbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQotICAgICAgICBqYXZhMndzbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0gICAgICAgIGphdmEyd3NsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0gICAgICAgIGphdmEyd3NHcm91cC5zZXRMYXlvdXQoamF2YTJ3c2xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgamF2YTJ3c0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIEZyb250ZW5kCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUZyb250ZW5kTGFiZWwoamF2YTJ3c0dyb3VwKTsKLSAgICAgICAgQ29tYm8gZnJvbnRlbmRDb21ibyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUZyb250ZW5kQ29tYm8oamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBEYXRhYmluZGluZwotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVEYXRhYmluZGluZ0xhYmVsKGphdmEyd3NHcm91cCk7Ci0gICAgICAgIENvbWJvIGRhdGFiaW5kaW5nQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVEYXRhYmluZGluZ0NvbWJvKGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gR2VuIENsaWVudAotICAgICAgICBnZW5lcmF0ZUNsaWVudEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlQ2xpZW50QnV0dG9uKGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0KLSAgICAgICAgLy8gR2VuIFNlcnZlcgotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0KLSAgICAgICAgLy8gR2VuIFdyYXBwZXIgYW5kIEZhdWx0IEJlYW4KLSAgICAgICAgZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uKAotICAgICAgICAgICAgICAgIGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0KLSAgICAgICAgLy8gR2VuIFdTREwKLSAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVXU0RMQnV0dG9uKGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBlbmFibGVXU0RMR3JvdXAoZ2VuZXJhdGVXU0RMQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBnZW5lcmF0ZVdTRExCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgd3NkbEdyb3VwID0gbmV3IEdyb3VwKGphdmEyd3NHcm91cCwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGxHcm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgd3NkbEdyb3VwLnNldExheW91dCh3c2RsR3JvdXBMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHdzZGxHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTT0FQQmluZGluZ0xhYmVsKHdzZGxHcm91cCk7Ci0KLSAgICAgICAgc29hcEJpbmRpbmdDb21ibyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNPQVBCaW5nQ29tYm8od3NkbEdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlWFNESW1wb3J0c0J1dHRvbih3c2RsR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxpbmsuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX0xJTkspOwotICAgICAgICBsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMyk7IAotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZW5hYmxlV1NETEdyb3VwKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZW5hYmxlV1NETEdyb3VwKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIGlmIChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfWFNEX0lNUE9SVFMpKTsKLQotICAgICAgICBnZW5lcmF0ZUNsaWVudEJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UKSk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSKSk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUykpOwotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBpZiAoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSkgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMiIpOyAvLyROT04tTkxTLTEkICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgICAgICBnZW5lcmF0ZUNsaWVudEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpOwotICAgICAgICBnZW5lcmF0ZVdTRExCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBpZiAoc29hcEJpbmRpbmdDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJTT0FQIDEuMiIpKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFNvYXAxMkJpbmRpbmcodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFNvYXAxMkJpbmRpbmcoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVhTREltcG9ydHMoY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVDbGllbnQoZ2VuZXJhdGVDbGllbnRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlU2VydmVyKGdlbmVyYXRlU2VydmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXU0RMKGdlbmVyYXRlV1NETEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU1dpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGNjYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuSmF2YVZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci0KLS8qKgotICogUHJvdmlkZXMgd2lkZ2V0cyBmb3IgSmF2YTJXUyBwcmVmZXJlbmNlcywgd2l6YXJkcywgZGlhbG9ncy4gRW5hYmxlcyB0aGUgcmV1c2UKLSAqIG9mIHdpZGdldHMgaW4gbXVsdGlwbGUgbG9jYXRpb25zLiBXaWRnZXRzIGhhdmUgdGhlcmUgbGFiZWxpbmcgYW5kIHRvb2x0aXBzCi0gKiBzZXQgaGVyZSBhbmQgd2hlcmUgcG9zc2libGUgbGlzdGVuZXJzIGFyZSBzZXQgd2hpY2ggdXBkYXRlIGluc3RhbmNlcyBvZgotICogPGNvZGU+SmF2YTJXU0NvbnRleHQ8L2NvZGU+IGFuZCA8Y29kZT5KYXZhMldTRGF0YU1vZGVsPC9jb2RlPi4KLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YTJXU1dpZGdldEZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBKYXZhMldTV2lkZ2V0RmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVNPQVBCaW5kaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBkZWZhdWx0U29hcEJpbmRpbmcgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGRlZmF1bHRTb2FwQmluZGluZy5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19ERUZBVUxUX1NPQVBCSU5ESU5HX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRTb2FwQmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVNPQVBCaW5nQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBDb21ibyBzb2FwQmluZGluZ0NvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NPQVAxMl9CSU5ESU5HX1RPT0xUSVApOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLmFkZCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLmFkZCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBCaW5kaW5nID0gKChDb21ibykgZS53aWRnZXQpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEJpbmRpbmcuZXF1YWxzKCJTT0FQIDEuMiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRTb2FwMTJCaW5kaW5nKHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaWYgKGNvbnRleHQuaXNTb2FwMTJCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdDb21ibzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgQnV0dG9uIGNyZWF0ZVhTREltcG9ydHMgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fWFNEX0lNUE9SVFMpOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19DUkVBVEVfWFNEX0lNUE9SVFNfVE9PTFRJUCk7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlWFNESW1wb3J0cygoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMuc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVYU0RJbXBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlRnJvbnRlbmRMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGZyb250ZW5kTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGZyb250ZW5kTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9ERUZBVUxUX0ZST05URU5EX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGZyb250ZW5kTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVGcm9udGVuZENvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gZnJvbnRlbmRDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBmcm9udGVuZENvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19GUk9OVEVORF9UT09MVElQKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5hZGQoRnJvbnRlbmQuSkFYV1MuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmcm9udGVuZCA9IGZyb250ZW5kQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RnJvbnRlbmQoRnJvbnRlbmQuZ2V0KGZyb250ZW5kKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZyb250ZW5kLmVxdWFscyhGcm9udGVuZC5KQVhXUy5nZXRMaXRlcmFsKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGF0YWJpbmRpbmcoRGF0YUJpbmRpbmcuZ2V0KERhdGFCaW5kaW5nLkpBWEIuZ2V0TGl0ZXJhbCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmIChmcm9udGVuZC5lcXVhbHMoInNpbXBsZSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGF0YWJpbmRpbmcoImFlZ2lzIik7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZXRUZXh0KGNvbnRleHQuZ2V0RnJvbnRlbmQoKS5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgIHJldHVybiBmcm9udGVuZENvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlRGF0YWJpbmRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGRhdGFiaW5kaW5nTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9ERUZBVUxUX0RBVEFCSU5ESU5HX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVEYXRhYmluZGluZ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gZGF0YWJpbmRpbmdDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19EQVRBQklORElOR19UT09MVElQKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5hZGQoRGF0YUJpbmRpbmcuSkFYQi5nZXRMaXRlcmFsKCkpOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXREYXRhYmluZGluZyhEYXRhQmluZGluZy5nZXQoZGF0YWJpbmRpbmdDb21iby5nZXRUZXh0KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0VGV4dChjb250ZXh0LmdldERhdGFiaW5kaW5nKCkuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlR2VuZXJhdGVDbGllbnRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuQ2xpZW50QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fQ0xJRU5UX0xBQkVMKTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5FUkFURV9DTElFTlRfVE9PTFRJUCk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVDbGllbnQoZ2VuQ2xpZW50QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICByZXR1cm4gZ2VuQ2xpZW50QnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlblNlcnZlckJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VOX1NFUlZFUl9MQUJFTCk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVApOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlU2VydmVyKGdlblNlcnZlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgcmV0dXJuIGdlblNlcnZlckJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuV3JhcHBlckZhdWx0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbldyYXBwZXJGYXVsdEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fV1JBUFBFUl9GQVVMVF9MQUJFTCk7Ci0gICAgICAgIGdlbldyYXBwZXJGYXVsdEJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VORVJBVEVfV1JBUFBFUkJFQU5fVE9PTFRJUCk7Ci0gICAgICAgIGdlbldyYXBwZXJGYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhnZW5XcmFwcGVyRmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuV3JhcHBlckZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKTsKLSAgICAgICAgcmV0dXJuIGdlbldyYXBwZXJGYXVsdEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZVdTRExCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuV1NETEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5XU0RMQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9XU0RMX0xBQkVMKTsKLSAgICAgICAgZ2VuV1NETEJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VORVJBVEVfV1NETF9UT09MVElQKTsKLSAgICAgICAgZ2VuV1NETEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXU0RMKGdlbldTRExCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuV1NETEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICAgICAgcmV0dXJuIGdlbldTRExCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVXU0RMRmlsZU5hbWVMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHdzZGxGaWxlTmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICB3c2RsRmlsZU5hbWVMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19XU0RMX0ZJTEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiB3c2RsRmlsZU5hbWVMYWJlbDsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVXU0RMRmlsZU5hbWVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgVGV4dCB3c2RsRmlsZVRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICB3c2RsRmlsZVRleHQuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX09VVFBVVF9GSUxFX1RPT0xUSVApOwotICAgICAgICB3c2RsRmlsZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbEZpbGVOYW1lKHdzZGxGaWxlVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgd3NkbEZpbGVUZXh0LnNldFRleHQobW9kZWwuZ2V0V3NkbEZpbGVOYW1lKCkpOwotICAgICAgICByZXR1cm4gd3NkbEZpbGVUZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVVzZVNFSUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiB1c2VTRUlCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgdXNlU0VJQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1VTRV9TRUlfQlVUVE9OKTsKLSAgICAgICAgcmV0dXJuIHVzZVNFSUJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvLyAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUluZm9ybWF0aW9uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAvLyAgICAgICAgTGFiZWwgaW5mb0xhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotICAgIC8vICAgICAgICBpbmZvTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLmJpbmQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1VTRV9TRUlfSU5GT19MQUJFTCwgc3RhcnRpbmdQb2ludFR5cGUKLSAgICAvLyAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudE5hbWUoKSkpOwotICAgIC8vICAgICAgICByZXR1cm4gaW5mb0xhYmVsOwotICAgIC8vICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlUGFkZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVTZWxlY3RTRUlCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gc2VsZWN0U0VJQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdFNFSUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVNlbGVjdFNFSUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgc2VsZWN0U0VJTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNlbGVjdFNFSUxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9TRUlfTEFCRUwpOwotICAgICAgICByZXR1cm4gc2VsZWN0U0VJTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVTZWxlY3RTRUlDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTRGF0YU1vZGVsIG1vZGVsLAotICAgICAgICAgICAgSVR5cGUgamF2YVN0YXJ0aW5nUG9pbnRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIHNlaUNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIHNlaUNvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX1RPT0xUSVApOwotCi0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSA9IGphdmFTdGFydGluZ1BvaW50VHlwZS5uZXdUeXBlSGllcmFyY2h5KGphdmFQcm9qZWN0LCBudWxsKTsKLSAgICAgICAgICAgIElUeXBlW10gYWxsSW50ZXJmYWNlcyA9IHR5cGVIaWVyYXJjaHkuZ2V0QWxsSW50ZXJmYWNlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxJbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSVR5cGUgaXR5cGUgPSBhbGxJbnRlcmZhY2VzW2ldOwotICAgICAgICAgICAgICAgIGlmICghaXR5cGUuaXNCaW5hcnkoKSAmJiBpdHlwZS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKS5lcXVhbHMoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZWlDb21iby5hZGQoaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZWlDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VpSW50ZXJmYWNlTmFtZSA9IHNlaUNvbWJvLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKHNlaUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzZWlDb21iby5kZXNlbGVjdEFsbCgpOwotICAgICAgICByZXR1cm4gc2VpQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnJvd3NlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19CUk9XU0VfTEFCRUwpOwotICAgICAgICByZXR1cm4gYnJvd3NlQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUV4dHJhY3RTRUlCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gZXh0cmFjdFNFSUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0VYVFJBQ1RfU0VJX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGV4dHJhY3RTRUlCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVFeHRyYWN0U0VJTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBleHRyYWN0U0VJTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGV4dHJhY3RTRUlMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19FWFRSQUNUX1NFSV9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBleHRyYWN0U0VJTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVNFSUludGVyZmFjZU5hbWVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVGV4dCBzZWlJbnRlcmZhY2VOYW1lVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIHNlaUludGVyZmFjZU5hbWVUZXh0LnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19FWFRSQUNUX1NFSV9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIHNlaUludGVyZmFjZU5hbWVUZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTWVtZWJlcnNUb0V4dHJhY3RMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHNlaU1lbWJlcnNUb0V4dHJhY3RMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdExhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0VYVFJBQ1RfTUVNQkVSU19MQUJFTCk7Ci0gICAgICAgIHJldHVybiBzZWlNZW1iZXJzVG9FeHRyYWN0TGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDaGVja2JveFRhYmxlVmlld2VyIGNyZWF0ZVNFSU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENoZWNrYm94VGFibGVWaWV3ZXIgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QocGFyZW50LAotICAgICAgICAgICAgICAgIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgcmV0dXJuIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVTZWxlY3RBbGxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9BTExfQlVUVE9OKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdEFsbEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVEZXNlbGVjdEFsbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0RFU0VMRUNUX0FMTF9CVVRUT04pOwotICAgICAgICByZXR1cm4gZGVzZWxlY3RBbGxCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVTZWxlY3RJbXBsZW1lbnRhdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgc2VsZWN0SW1wbGVtZW50YXRpb25MYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25MYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT04pOwotICAgICAgICByZXR1cm4gc2VsZWN0SW1wbGVtZW50YXRpb25MYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIGZpbmFsIEphdmEyV1NEYXRhTW9kZWwgbW9kZWwsIElUeXBlIGphdmFTdGFydGluZ1BvaW50VHlwZSkgewotICAgICAgICBmaW5hbCBDb21ibyBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9JTVBMRU1FTlRBVElPTl9UT09MVElQKTsKLQotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkgPSBqYXZhU3RhcnRpbmdQb2ludFR5cGUubmV3VHlwZUhpZXJhcmNoeShqYXZhUHJvamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICBJVHlwZVtdIGFsbEltcGxlbWVudGF0aW9ucyA9IHR5cGVIaWVyYXJjaHkuZ2V0QWxsU3VidHlwZXMoamF2YVN0YXJ0aW5nUG9pbnRUeXBlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsSW1wbGVtZW50YXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSVR5cGUgaXR5cGUgPSBhbGxJbXBsZW1lbnRhdGlvbnNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKCFpdHlwZS5pc0JpbmFyeSgpICYmIGl0eXBlLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpLmVxdWFscyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGl0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArPSAiLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IHBhY2thZ2VOYW1lICsgaXR5cGUuZ2V0UHJpbWFyeUVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmFkZChxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRlVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wbGVtZW50YXRpb25OYW1lID0gc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKGltcGxlbWVudGF0aW9uTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiA8Y29kZT5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzwvY29kZT4gdGhhdCBkaXNwbGF5cyBhbGwgdGhlIGNsYXNzZXMgb3IgYWxsIHRoZSBpbnRlcmZhY2VzCi0gICAgICogd2l0aGluIGEgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPiBhbGxvd2luZyBvbmUgY2xhc3Mgb3IgaW50ZXJmYWNlIHRvIGJlIHNlbGVjdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbAotICAgICAqIEBwYXJhbSB0aXRsZSB0aGUgZGlhbG9nIHRpdGxlCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGRpYWxvZyBtZXNzYWdlCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBqYXZhIHByb2plY3QgdGhhdCBpcyBmaWx0ZXJlZAotICAgICAqIEBwYXJhbSBlbGVtZW50S2luZHMgYSBmbGFnIGRlZmluaW5nIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50czsgdGhlIG9ubHkgdmFsaWQgdmFsdWVzIGFyZToKLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1M8L2NvZGU+Ci0gICAgICogIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRTwvY29kZT4KLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfQU5EX0lOVEVSRkFDRTwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IHRyZWUgc2VsZWN0aW9uIGRpYWxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgY3JlYXRlRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBpbnQgZWxlbWVudEtpbmRzKSB7Ci0gICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhwYXJlbnQsCi0gICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldElucHV0KEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0KLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLmFkZEZpbHRlcihuZXcgSmF2YVZpZXdlckZpbHRlcihqYXZhUHJvamVjdCwgZWxlbWVudEtpbmRzKSk7Ci0KLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldFZhbGlkYXRvcihuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQotICAgICAgICAgICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gc2VsZWN0aW9uRGlhbG9nOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9TcHJpbmdDb25maWdDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL1NwcmluZ0NvbmZpZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQzNThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL1NwcmluZ0NvbmZpZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotcHVibGljIGNsYXNzIFNwcmluZ0NvbmZpZ0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgcHJpdmF0ZSBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdXNlQ1hGU2VydmxldEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uOwotICAgIAotICAgIHB1YmxpYyBTcHJpbmdDb25maWdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBhZGRDb250cm9scygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBwcmVmbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHNwcmluZ0NvbmZpZ0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICBzcHJpbmdDb25maWdHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuU1BSSU5HX0NPTkZJR19HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgc3ByaW5nQ29uZmlnTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ0dyb3VwLnNldExheW91dChzcHJpbmdDb25maWdMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBzcHJpbmdDb25maWdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB1c2VDWEZTZXJ2bGV0QnV0dG9uID0gbmV3IEJ1dHRvbihzcHJpbmdDb25maWdHcm91cCwgU1dULlJBRElPKTsKLSAgICAgICAgdXNlQ1hGU2VydmxldEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuU1BSSU5HX0NPTkZJR19VU0VfQ1hGX1NFUlZMRVQpOwotICAgICAgICB1c2VDWEZTZXJ2bGV0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSAoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCFzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24gPSBuZXcgQnV0dG9uKHNwcmluZ0NvbmZpZ0dyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uCi0gICAgICAgICAgICAgICAgLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5TUFJJTkdfQ09ORklHX1VTRV9DWEZfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQpOwotICAgICAgICB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSAoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKGNvbnRleHQuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSkgewotICAgICAgICAgICAgdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1c2VDWEZTZXJ2bGV0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgYm9vbGVhbiB1c2VTcHJpbmdBcHBjb250ZXh0ID0gQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUKTsKLSAgICAgICAgdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlU3ByaW5nQXBwY29udGV4dCk7Ci0gICAgICAgIHVzZUNYRlNlcnZsZXRCdXR0b24uc2V0U2VsZWN0aW9uKCF1c2VTcHJpbmdBcHBjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGNvbnRleHQuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL1dTREwySmF2YVdpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL1dTREwySmF2YVdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0Y2FjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9XU0RMMkphdmFXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5kaWFsb2dzLlJlc291cmNlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2Vycy5QYWNrYWdlTmFtZUNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogUHJvdmlkZXMgd2lkZ2V0cyBmb3IgV1NETDJKYXZhIHByZWZlcmVuY2VzLCB3aXphcmRzLCBkaWFsb2dzLiBFbmFibGVzIHRoZQotICogcmV1c2Ugb2Ygd2lkZ2V0cyBpbiBtdWx0aXBsZSBsb2NhdGlvbnMuIFdpZGdldHMgaGF2ZSB0aGVyZSBsYWJlbGluZyBhbmQKLSAqIHRvb2x0aXBzIHNldCBoZXJlIGFuZCB3aGVyZSBwb3NzaWJsZSBsaXN0ZW5lcnMgYXJlIHNldCB3aGljaCB1cGRhdGUgaW5zdGFuY2VzCi0gKiBvZiA8Y29kZT5XU0RMMkphdmFDb250ZXh0PC9jb2RlPiBhbmQgPGNvZGU+V1NETDJKYXZhRGF0YU1vZGVsPC9jb2RlPi4KLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19EVl9BUkcgPSAiLVhkdiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX0FSRyA9ICItWHRzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfTVVMVElfQVJHID0gIi1YdHM6c3R5bGU6bXVsdGlsaW5lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfU0lNUExFID0gIi1YdHM6c3R5bGU6c2ltcGxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfTE9DQVRPUl9BUkcgPSAiLVhsb2NhdG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfU1lOQ19NRVRIT0RTX0FSRyA9ICItWHN5bmMtbWV0aG9kcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX01BUktfR0VORVJBVEVEX0FSRyA9ICItbWFyay1nZW5lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19FUElTT0RFX0ZJTEVfQVJHID0gIi1lcGlzb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUdlbmVyYXRlQ2xpZW50QnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlbkNsaWVudEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VOX0NMSUVOVF9MQUJFTCk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9HRU5FUkFURV9DTElFTlRfVE9PTFRJUCk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGdlbkNsaWVudEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVDbGllbnQoKSk7Ci0gICAgICAgIHJldHVybiBnZW5DbGllbnRCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuU2VydmVyQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fU0VSVkVSX0xBQkVMKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuU2VydmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgcmV0dXJuIGdlblNlcnZlckJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlbkltcGxlbWVudGF0aW5CdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuSW1wbGVtZW50YXRpbkJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fSU1QTEVNRU5UQVRJT05fTEFCRUwpOwotICAgICAgICBnZW5JbXBsZW1lbnRhdGluQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OX1RPT0xUSVApOwotICAgICAgICBnZW5JbXBsZW1lbnRhdGluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihnZW5JbXBsZW1lbnRhdGluQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbkltcGxlbWVudGF0aW5CdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpKTsKLSAgICAgICAgcmV0dXJuIGdlbkltcGxlbWVudGF0aW5CdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QUk9DRVNTX1NPQVBfSEVBREVSUyk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QUk9DRVNTX1NPQVBfSEVBREVSU19UT09MVElQKTsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkpOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uCi0gICAgICAgIC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9NQVBQSU5HKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24KLSAgICAgICAgLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0RFRkFVTFRfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUCk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcobmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSk7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVFeGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbgotICAgICAgICAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9VU0VfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORyk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbgotICAgICAgICAuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfRVhDTFVERV9OQU1FU1BBQ0VfTE9BRElOR19UT09MVElQKTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpKTsKLSAgICAgICAgcmV0dXJuIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVOb0FkZHJlc3NCaW5kaW5nQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuYmluZChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkcsCi0gICAgICAgICAgICAgICAgbW9kZWwuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpKTsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRUb29sVGlwVGV4dCgKLSAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLmJpbmQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfTk9fQUREUkVTU19CSU5ESU5HX1RPT0xUSVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSkpOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0Tm9BZGRyZXNzQmluZGluZyhub0FkZHJlc3NCaW5kaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzTm9BZGRyZXNzQmluZGluZygpKTsKLSAgICAgICAgcmV0dXJuIG5vQWRkcmVzc0JpbmRpbmdCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9BVVRPX05BTUVfUkVTT0xVVElPTik7Ci0gICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9BVVRPX05BTUVfUkVTT0xVVElPTl9UT09MVElQKTsKLSAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzQXV0b05hbWVSZXNvbHV0aW9uKCkpOwotICAgICAgICByZXR1cm4gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNEZWZhdWx0VmFsdWVzSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNJdGVtLnNldFRleHQoMCwgWEpDX0RWX0FSRyk7Ci0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0RFRkFVTFRfVkFMVUVTKTsKLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc0l0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIHJldHVybiB4amNEZWZhdWx0VmFsdWVzSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY1RvU3RyaW5nSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nSXRlbS5zZXRUZXh0KDAsIFhKQ19UU19BUkcpOwotICAgICAgICB4amNUb1N0cmluZ0l0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfVE9TVFJJTkcpOwotICAgICAgICB4amNUb1N0cmluZ0l0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY1RvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbS5zZXRUZXh0KDAsIFhKQ19UU19NVUxUSV9BUkcpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZUl0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfVE9TVFJJTkdfTVVMVElMSU5FKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNUb1N0cmluZ011bHRpTGluZSgpKTsKLSAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY1RvU3RyaW5nU2ltcGxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlSXRlbS5zZXRUZXh0KDAsIFhKQ19UU19TSU1QTEUpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZUl0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfVE9TVFJJTkdfU0lNUExFKTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNUb1N0cmluZ1NpbXBsZSgpKTsKLSAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nU2ltcGxlSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjTG9jYXRvckl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNMb2NhdG9ySXRlbS5zZXRUZXh0KDAsIFhKQ19MT0NBVE9SX0FSRyk7Ci0gICAgICAgIHhqY0xvY2F0b3JJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0xPQ0FUT1IpOwotICAgICAgICB4amNMb2NhdG9ySXRlbS5zZXRDaGVja2VkKG1vZGVsLmlzWGpjTG9jYXRvcigpKTsKLSAgICAgICAgcmV0dXJuIHhqY0xvY2F0b3JJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjU3luY01ldGhvZHNJdGVtID0gbmV3IFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNJdGVtLnNldFRleHQoMCwgWEpDX1NZTkNfTUVUSE9EU19BUkcpOwotICAgICAgICB4amNTeW5jTWV0aG9kc0l0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfU1lOQ19NRVRIT0RTKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNTeW5jTWV0aG9kcygpKTsKLSAgICAgICAgcmV0dXJuIHhqY1N5bmNNZXRob2RzSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNNYXJrR2VuZXJhdGVkVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjTWFya0dlbmVyYXRlZEl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkSXRlbS5zZXRUZXh0KDAsIFhKQ19NQVJLX0dFTkVSQVRFRF9BUkcpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19NQVJLX0dFTkVSQVRFRCk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNNYXJrR2VuZXJhdGVkKCkpOwotICAgICAgICByZXR1cm4geGpjTWFya0dlbmVyYXRlZEl0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZUl0ZW0gY3JlYXRlWEpDRXBpc29kZUZpbGVUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNFcGlzb2RlRmlsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNFcGlzb2RlRmlsZUl0ZW0uc2V0VGV4dCgwLCBYSkNfRVBJU09ERV9GSUxFX0FSRyk7Ci0gICAgICAgIHhqY0VwaXNvZGVGaWxlSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19FUElTT0RFX0ZJTEUpOwotICAgICAgICByZXR1cm4geGpjRXBpc29kZUZpbGVJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGUgY3JlYXRlWEpDQXJnVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZSB4amNBcmdzVGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQ0hFQ0sgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdTX1RPT0xUSVApOwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICB4amNBcmdzVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgICAgICBUYWJsZUNvbHVtbiB4amNBcmdDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY0FyZ0NvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdfQ09MVU1OX05BTUUpOwotCi0gICAgICAgIENvbHVtbldlaWdodERhdGEgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBUYWJsZUNvbHVtbiBkZXNjcmlwdGlvbkNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgZGVzY3JpcHRpb25Db2x1bW4uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfREVTQ1JJUFRJT05fQ09MVU1OX05BTUUpOwotICAgICAgICBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMjAwLCAyMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIHhqY0FyZ3NUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgeGpjQXJnID0gdGFibGVJdGVtLmdldFRleHQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tlZCA9IHRhYmxlSXRlbS5nZXRDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19EVl9BUkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX1RTX0FSRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX1RTX01VTFRJX0FSRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX1RTX1NJTVBMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nU2ltcGxlKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX0xPQ0FUT1JfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjTG9jYXRvcihjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19TWU5DX01FVEhPRFNfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjU3luY01ldGhvZHMoY2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoeGpjQXJnLmVxdWFscyhYSkNfTUFSS19HRU5FUkFURURfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjTWFya0dlbmVyYXRlZChjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICB4amNBcmdDb2x1bW4ucGFjaygpOwotICAgICAgICBkZXNjcmlwdGlvbkNvbHVtbi5wYWNrKCk7Ci0KLSAgICAgICAgcmV0dXJuIHhqY0FyZ3NUYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUZyb250ZW5kTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBmcm9udGVuZExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBmcm9udGVuZExhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBmcm9udGVuZExhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlRnJvbnRlbmRDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIGZyb250ZW5kQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9GUk9OVEVORF9UT09MVElQKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5hZGQobW9kZWwuZ2V0RnJvbnRlbmQoKS5nZXRMaXRlcmFsKCkpOwotICAgICAgICBmcm9udGVuZENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBmcm9udGVuZENvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgcmV0dXJuIGZyb250ZW5kQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVEYXRhYmluZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgZGF0YWJpbmRpbmdMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZGF0YWJpbmRpbmdMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX0RFRkFVTFRfREFUQUJJTkRJTkdfTEFCRUwpOwotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmdMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZURhdGFiaW5kaW5nQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBDb21ibyBkYXRhYmluZGluZ0NvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfREFUQUJJTkRJTkdfVE9PTFRJUCk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uYWRkKG1vZGVsLmdldERhdGFiaW5kaW5nKCkuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgIHJldHVybiBkYXRhYmluZGluZ0NvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlV1NETFZlcnNpb25MYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHdzZGxWZXJzaW9uTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHdzZGxWZXJzaW9uTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9XU0RMX1ZFUlNJT05fTEFCRUwpOwotICAgICAgICByZXR1cm4gd3NkbFZlcnNpb25MYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVdTRExWZXJzaW9uQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBDb21ibyB3c2RsVmVyc2lvbkNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIHdzZGxWZXJzaW9uQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfV1NETF9WRVJTSU9OX1RPT0xUSVApOwotICAgICAgICB3c2RsVmVyc2lvbkNvbWJvLmFkZChtb2RlbC5nZXRXc2RsVmVyc2lvbigpKTsKLSAgICAgICAgd3NkbFZlcnNpb25Db21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgd3NkbFZlcnNpb25Db21iby5zZWxlY3QoMCk7Ci0gICAgICAgIHJldHVybiB3c2RsVmVyc2lvbkNvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZURlZmF1bHRWYWx1ZXNCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gdXNlRGVmYXVsdFZhbHVlc0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfVVNFX0RFRkFVTFRfVkFMVUVTKTsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9ERUZBVUxUX1ZBTFVFU19UT09MVElQKTsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldFVzZURlZmF1bHRWYWx1ZXModXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIHJldHVybiB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlT3V0cHV0RGlyZWN0b3J5TGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBzcmNEaXJMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc3JjRGlyTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9PVVRQVVRfRElSRUNUT1JZKTsKLSAgICAgICAgc3JjRGlyTGFiZWwuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWV9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIHNyY0RpckxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlT3V0cHV0RGlyZWN0b3J5Q29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIG91dHB1dERpckNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIG91dHB1dERpckNvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUllfVE9PTFRJUCk7Ci0gICAgICAgIG91dHB1dERpckNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGphdmFTb3VyY2VGb2xkZXIgPSBvdXRwdXREaXJDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0SmF2YVNvdXJjZUZvbGRlcihqYXZhU291cmNlRm9sZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcG9wdWxhdGVPdXRwdXREaXJlY3RvcnlDb21ibyhvdXRwdXREaXJDb21ibywgbW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG91dHB1dERpckNvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwb3B1bGF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKENvbWJvIG91dHB1dERpckNvbWJvLCBTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgb3V0cHV0RGlyQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpCi0gICAgICAgICAgICAuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZUZyYWdtZW50Um9vdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gcGFja2FnZUZyYWdtZW50Um9vdHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dERpckNvbWJvLmFkZChwYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dERpckNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVBhY2thZ2VOYW1lTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBwYWNrYWdlTmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBwYWNrYWdlTmFtZUxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgcGFja2FnZU5hbWVMYWJlbC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QQUNLQUdFX05BTUVfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZUxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVQYWNrYWdlTmFtZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIFRleHQgcGFja2FnZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9UT09MVElQKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5wdXQobW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldFRleHQobW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuZ2V0KG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QQUNLQUdFX05BTUVfT1BUSU9OQUwpOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTF9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZU1hcHBpbmdCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZVZpZXdlckNvbHVtbiBjcmVhdGVXU0RMTmFtZXNwYWNlVmlld2VyQ29sdW1uKFRhYmxlVmlld2VyIHRhYmxlVmlld2VyKSB7Ci0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHdzZGxOYW1lc3BhY2VWaWV3ZXJDb2x1bW4gPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4odGFibGVWaWV3ZXIsIFNXVC5MRUZUKTsKLSAgICAgICAgd3NkbE5hbWVzcGFjZVZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBUYWJsZUNvbHVtbiB3c2RsTmFtZXNwYWNlQ29sdW1uID0gd3NkbE5hbWVzcGFjZVZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgd3NkbE5hbWVzcGFjZUNvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1dTRExfTkFNRVNQQUNFX0NPTFVNTl9IRUFERVIpOwotICAgICAgICB3c2RsTmFtZXNwYWNlQ29sdW1uLnBhY2soKTsKLSAgICAgICAgcmV0dXJuIHdzZGxOYW1lc3BhY2VWaWV3ZXJDb2x1bW47Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZVZpZXdlckNvbHVtbiBjcmVhdGVQYWNrYWdlTmFtZUNvbHVtbihUYWJsZVZpZXdlciB0YWJsZVZpZXdlciwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHRhYmxlVmlld2VyLCBTV1QuTEVGVCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IFBhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCkpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIHBhY2thZ2VOYW1lQ29sdW1uID0gcGFja2FnZU5hbWVWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lQ29sdW1uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX0NPTFVNTl9IRUFERVIpOwotICAgICAgICBwYWNrYWdlTmFtZUNvbHVtbi5wYWNrKCk7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVNlcnZpY2VOYW1lTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBzZXJ2aWNlTmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZXJ2aWNlTmFtZUxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgc2VydmljZU5hbWVMYWJlbC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZUxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlU2VydmljZU5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gc2VydmljZU5hbWVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgc2VydmljZU5hbWVDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUCk7Ci0KLSAgICAgICAgc2VydmljZU5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZUNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBvcHVsYXRlU2VydmljZU5hbWVDb21ibyhzZXJ2aWNlTmFtZUNvbWJvLCBtb2RlbCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lQ29tYm87Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBvcHVsYXRlU2VydmljZU5hbWVDb21ibyhDb21ibyBzZXJ2aWNlTmFtZUNvbWJvLCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc2VydmljZU5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgTWFwIHNlcnZpY2VzTWFwID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VzTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTZXQgc2VydmljZXNFbnRyeVNldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Igc2VydmljZXNJdGVyYXRvciA9IHNlcnZpY2VzRW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoc2VydmljZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IHNlcnZpY2VFbnRyeSA9IChNYXAuRW50cnkpIHNlcnZpY2VzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2VydmljZUVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gc2VydmljZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLmFkZChxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lQ29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlQmluZGluZ0ZpbGVzTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBiaW5kaW5nRmlsZXNMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgYmluZGluZ0ZpbGVzTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX0ZJTEVTKTsKLSAgICAgICAgYmluZGluZ0ZpbGVzTGFiZWwuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19OQU1FX1RPT0xUSVApOwotICAgICAgICByZXR1cm4gYmluZGluZ0ZpbGVzTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZUJpbmRpbmdGaWxlc0xpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBmaW5hbCBMaXN0IGJpbmRpbmdGaWxlc0xpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfTkFNRV9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdGaWxlc0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQWRkQmluZGluZ0ZpbGVCdXR0b24oZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsLAotICAgICAgICAgICAgZmluYWwgTGlzdCBiaW5kaW5nRmlsZXNMaXN0KSB7Ci0gICAgICAgIEJ1dHRvbiBhZGRCaW5kaW5nRmlsZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGFkZEJpbmRpbmdGaWxlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19GSUxFU19BREQpOwotICAgICAgICBhZGRCaW5kaW5nRmlsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IG5ldyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgInhtbCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfRklMVEVSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX1RJVExFKTsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX01FU1NBR0UpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFNlbGVjdGlvbkRpYWxvZy5PSykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCkuY29udGFpbnMocmVzdWx0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCkuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LmFkZChyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGFkZEJpbmRpbmdGaWxlQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCwKLSAgICAgICAgICAgIGZpbmFsIExpc3QgYmluZGluZ0ZpbGVzTGlzdCkgewotICAgICAgICBmaW5hbCBCdXR0b24gcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfUkVNT1ZFKTsKLSAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0ZWRCaW5kaW5nRmlsZXMgPSBiaW5kaW5nRmlsZXNMaXN0LmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGJpbmRpbmdGaWxlIDogc2VsZWN0ZWRCaW5kaW5nRmlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYmluZGluZ0ZpbGVzTGlzdC5yZW1vdmUoYmluZGluZ0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5yZW1vdmUoYmluZGluZ0ZpbGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nRmlsZXNMaXN0LmdldEl0ZW1Db3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nRmlsZXNMaXN0LmdldEl0ZW1Db3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVBhZGRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVYTUxDYXRhbG9nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCB4bWxDYXRhbG9nTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHhtbENhdGFsb2dMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hNTF9DQVRMT0cpOwotICAgICAgICB4bWxDYXRhbG9nTGFiZWwuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWE1MX0NBVEFMT0dfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiB4bWxDYXRhbG9nTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVhNTENhdGFsb2dUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBmaW5hbCBUZXh0IHhtbENhdGFsb2dUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgeG1sQ2F0YWxvZ1RleHQuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWE1MX0NBVEFMT0dfVE9PTFRJUCk7Ci0gICAgICAgIHhtbENhdGFsb2dUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB4bWxDYXRhbG9nID0geG1sQ2F0YWxvZ1RleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldENhdGFsb2dGaWxlKHhtbENhdGFsb2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4geG1sQ2F0YWxvZ1RleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlWE1MQ2F0YWxvZ0Jyb3dzZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiB4bWxDYXRhbG9nQnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgeG1sQ2F0YWxvZ0Jyb3dzZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hNTF9DQVRMT0dfQlJPV1NFKTsKLSAgICAgICAgcmV0dXJuIHhtbENhdGFsb2dCcm93c2VCdXR0b247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZGYWNldEluc3RhbGxXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZGYWNldEluc3RhbGxXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjVjOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGRmFjZXRJbnN0YWxsV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuQWJzdHJhY3RGYWNldFdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDWEZGYWNldEluc3RhbGxXaXphcmRQYWdlIGV4dGVuZHMgQWJzdHJhY3RGYWNldFdpemFyZFBhZ2UgewotCi0gICAgcHJpdmF0ZSBDWEZEYXRhTW9kZWwgZGF0YU1vZGVsOwotICAgIHByaXZhdGUgQ1hGQ29udGV4dCBjeGZDb250ZXh0OwotICAgIC8vICAgIHByaXZhdGUgQnV0dG9uIHVzZUNYRlNlcnZsZXRCdXR0b247Ci0gICAgLy8gICAgcHJpdmF0ZSBCdXR0b24gdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbjsKLQotICAgIHByaXZhdGUgQ29tYm9WaWV3ZXIgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyOwotCi0gICAgcHVibGljIENYRkZhY2V0SW5zdGFsbFdpemFyZFBhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKCJjeGYuY29yZS5mYWNldC5pbnN0YWxsLnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRUaXRsZShDWEZVSU1lc3NhZ2VzLkNYRl9GQUNFVF9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oQ1hGVUlNZXNzYWdlcy5DWEZfRkFDRVRfSU5TVEFMTF9XSVpBUkRfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIGN4ZkNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZyhPYmplY3QgY29uZmlnKSB7Ci0gICAgICAgIGRhdGFNb2RlbCA9IChDWEZEYXRhTW9kZWwpIGNvbmZpZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0cmFuc2ZlclN0YXRlVG9Db25maWcoKSB7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIENYRkluc3RhbGwgc2VsZWN0ZWRJbnN0YWxsID0gKENYRkluc3RhbGwpIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGRhdGFNb2RlbC5zZXREZWZhdWx0UnVudGltZVZlcnNpb24oc2VsZWN0ZWRJbnN0YWxsLmdldFZlcnNpb24oKSk7Ci0gICAgICAgIC8vICAgICAgICBkYXRhTW9kZWwuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgTGluayBsaW5rID0gbmV3IExpbmsoY29tcG9zaXRlLCBTV1QuUklHSFQpOwotICAgICAgICBsaW5rLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfQ09ORklHVVJFX0lOU1RBTExFRF9SVU5USU1FU19MQUJFTCk7Ci0gICAgICAgIGxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UiIH0sIG51bGwpLm9wZW4oKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbGluay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiQ1hGIHJ1bnRpbWU6Iik7Ci0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uPD8+KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gKENYRkluc3RhbGwpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjeGZJbnN0YWxsLmdldFR5cGUoKSArICIgIiArIGN4Zkluc3RhbGwuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxDWEZJbnN0YWxsPiBpbnN0YWxsYXRpb25zID0gY3hmQ29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkudmFsdWVzKCk7Ci0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRJbnB1dChpbnN0YWxsYXRpb25zKTsKLSAgICAgICAgc2V0RGVmYXVsdCgpOwotCi0gICAgICAgIC8vICAgICAgICBHcm91cCBzcHJpbmdDb25maWdHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICAvLyAgICAgICAgc3ByaW5nQ29uZmlnR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlNQUklOR19DT05GSUdfR1JPVVBfTEFCRUwpOwotICAgICAgICAvLyAgICAgICAgR3JpZExheW91dCBzcHJpbmdDb25maWdMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCB0cnVlKTsKLSAgICAgICAgLy8gICAgICAgIHNwcmluZ0NvbmZpZ0dyb3VwLnNldExheW91dChzcHJpbmdDb25maWdMYXlvdXQpOwotICAgICAgICAvLyAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIC8vICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIC8vICAgICAgICBzcHJpbmdDb25maWdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gICAgICAgIHVzZUNYRlNlcnZsZXRCdXR0b24gPSBuZXcgQnV0dG9uKHNwcmluZ0NvbmZpZ0dyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICAvLyAgICAgICAgdXNlQ1hGU2VydmxldEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuU1BSSU5HX0NPTkZJR19VU0VfQ1hGX1NFUlZMRVQpOwotICAgICAgICAvLwotICAgICAgICAvLyAgICAgICAgdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbiA9IG5ldyBCdXR0b24oc3ByaW5nQ29uZmlnR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIC8vICAgICAgICB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5TUFJJTkdfQ09ORklHX1VTRV9DWEZfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQpOwotICAgICAgICAvLwotICAgICAgICAvLyAgICAgICAgaWYgKGN4ZkNvbnRleHQuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSkgewotICAgICAgICAvLyAgICAgICAgICAgIHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAvLyAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gICAgICAgICAgICB1c2VDWEZTZXJ2bGV0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgLy8gICAgICAgIH0KLQotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHQoKSB7Ci0gICAgICAgIFN0cmluZyBpbnRhbGxlZFZlcnNpb24gPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpOwotICAgICAgICBDWEZJbnN0YWxsIGRlZmF1bHRJbnN0YWxsID0gY3hmQ29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkuZ2V0KGludGFsbGVkVmVyc2lvbik7Ci0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmYXVsdEluc3RhbGwpLCB0cnVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkluc3RhbGxXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkluc3RhbGxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiNzBlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZJbnN0YWxsV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLQotcHVibGljIGNsYXNzIENYRkluc3RhbGxXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCi0gICAgcHJpdmF0ZSBDWEZJbnN0YWxsV2l6YXJkUGFnZSBjeGZJbnN0YWxsV2l6YXJkUGFnZTsKLSAgICBwcml2YXRlIENYRkluc3RhbGwgY3hmSW5zdGFsbDsKLQotICAgIHB1YmxpYyBDWEZJbnN0YWxsV2l6YXJkKCkgewotCi0gICAgfQotCi0gICAgcHVibGljIENYRkluc3RhbGxXaXphcmQoQ1hGSW5zdGFsbCBjeGZJbnN0YWxsKSB7Ci0gICAgICAgIHRoaXMuY3hmSW5zdGFsbCA9IGN4Zkluc3RhbGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0gICAgICAgIGlmIChjeGZJbnN0YWxsV2l6YXJkUGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjeGZJbnN0YWxsV2l6YXJkUGFnZSA9IG5ldyBDWEZJbnN0YWxsV2l6YXJkUGFnZSgpOwotICAgICAgICAgICAgaWYgKGN4Zkluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxXaXphcmRQYWdlLnNldENYRkluc3RhbGwoY3hmSW5zdGFsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWRkUGFnZShjeGZJbnN0YWxsV2l6YXJkUGFnZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGxXaXphcmRQYWdlLmZpbmlzaCgpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkluc3RhbGxXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZJbnN0YWxsV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E4MzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkluc3RhbGxXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuQ1hGUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkxhdW5jaFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBDWEZJbnN0YWxsV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotICAgIHByaXZhdGUgSVN0YXR1cyBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsIG51bGwpOwotICAgIHByaXZhdGUgSVN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFBhdHRlcm4gZGlnaXRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcXGQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotICAgIHByaXZhdGUgVGV4dCBjeGZIb21lRGlyVGV4dDsKLSAgICBwcml2YXRlIExhYmVsIGN4ZlRvb2xWZXJzaW9uTGFiZWw7Ci0KLSAgICBTdHJpbmcgY3hmUnVudGltZVZlcnNpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBjeGZSdW50aW1lTG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBjeGZSdW50aW1lVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIENYRkluc3RhbGwgY3hmSW5zdGFsbDsKLQotICAgIHByb3RlY3RlZCBDWEZJbnN0YWxsV2l6YXJkUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoImN4Zi5pbnRhbGwud2l6YXJkLnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRUaXRsZShDWEZVSU1lc3NhZ2VzLkNYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oQ1hGVUlNZXNzYWdlcy5DWEZfSU5TVEFMTF9XSVpBUkRfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihDWEZVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgImljb25zL3dpemJhbi9saWJyYXJ5X3dpei5wbmciKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9IT01FX0RJUl9MQUJFTCk7Ci0KLSAgICAgICAgY3hmSG9tZURpclRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0KLSAgICAgICAgY3hmSG9tZURpclRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGN4ZkhvbWVEaXJUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBicm93c2VCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9CUk9XU0VfQlVUVE9OX0xBQkVMKTsKLQotICAgICAgICBicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVEaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN4ZkhvbWVEaXJUZXh0LnNldFRleHQoZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy9DWEYgVmVyc2lvbgotICAgICAgICBMYWJlbCBjeGZWZXJzaW9uTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGN4ZlZlcnNpb25MYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9WRVJTT05fTEFCRUwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGN4ZlZlcnNpb25MYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBjeGZUb29sVmVyc2lvbkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgY3hmVG9vbFZlcnNpb25MYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBpZiAoY3hmSW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjeGZIb21lRGlyVGV4dC5zZXRUZXh0KGN4Zkluc3RhbGwuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDWEZJbnN0YWxsKENYRkluc3RhbGwgY3hmSW5zdGFsbCkgewotICAgICAgICB0aGlzLmN4Zkluc3RhbGwgPSBjeGZJbnN0YWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gY3hmSG9tZURpclRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAgJiYgQ1hGX0xPQ0FUSU9OX1NUQVRVUy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1cygpIHsKLSAgICAgICAgQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IGNoZWNrUnVudGltZUV4aXN0KGN4ZkhvbWVEaXJUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIGFwcGx5U3RhdHVzVG9QYWdlKGZpbmRNb3N0U2V2ZXJlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBseVN0YXR1c1RvUGFnZShJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA+IElTdGF0dXMuT0spIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlKGdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGZpbmRNb3N0U2V2ZXJlKCkgewotICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgY2hlY2tSdW50aW1lRXhpc3QoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgRmlsZSBjeGZIb21lRGlyID0gbmV3IEZpbGUocGF0aCk7Ci0gICAgICAgIGlmIChjeGZIb21lRGlyVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfTk9UX1NFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGN4ZkxpYlBhdGggPSBjeGZIb21lRGlyICsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgImxpYiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpZiAoY3hmSG9tZURpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBGaWxlIGN4ZkxpYkZvbGRlciA9IG5ldyBGaWxlKGN4ZkxpYlBhdGgpOwotICAgICAgICAgICAgaWYgKGN4ZkxpYkZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gY3hmSmFyRmlsZXMgPSBnZXRDWEZKYXJGaWxlcyhjeGZMaWJGb2xkZXIpOwotICAgICAgICAgICAgICAgIGlmIChjeGZKYXJGaWxlcyAhPSBudWxsICYmIGN4ZkphckZpbGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgSVN0YXR1cyB0b29sVmVyc2lvblN0YXR1cyA9IGdldFRvb2xWZXJzaW9uKGN4ZkxpYlBhdGgpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVG9vbFZlcnNpb24odG9vbFZlcnNpb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IE9LX1NUQVRVUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY3hmVG9vbFZlcnNpb25MYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBDWEZfTE9DQVRJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX05PVF9TRVQpOwotICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldENYRkphckZpbGVzKEZpbGUgZGlyZWN0b3J5KSB7Ci0gICAgICAgIFN0cmluZ1tdIGN4ZkphckZpbGVzID0gZGlyZWN0b3J5Lmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoImN4ZiIpICYmIG5hbWUuZW5kc1dpdGgoIi5qYXIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGRpZ2l0UGF0dGVybi5tYXRjaGVyKG5hbWUpLmZpbmQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGN4ZkphckZpbGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyBnZXRUb29sVmVyc2lvbihTdHJpbmcgY3hMaWJGb2xkZXJQYXRoKSB7Ci0gICAgICAgIEZpbGUgY3hmTGliRm9sZGVyID0gbmV3IEZpbGUoY3hMaWJGb2xkZXJQYXRoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGN4ZkxpYiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBTdHJpbmdbXSBqYXJGaWxlcyA9IGN4ZkxpYkZvbGRlci5saXN0KG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgamFyRmlsZSA6IGphckZpbGVzKSB7Ci0gICAgICAgICAgICBjeGZMaWIuYWRkKGN4TGliRm9sZGVyUGF0aCArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArIGphckZpbGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBJU3RhdHVzIHRvb2xWZXJzaW9uU3RhdHVzID0gTGF1bmNoVXRpbHMubGF1bmNoKGN4ZkxpYi50b0FycmF5KG5ldyBTdHJpbmdbY3hmTGliLnNpemUoKV0pLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmN4Zi50b29scy53c2RsdG8uV1NETFRvSmF2YSIsIG5ldyBTdHJpbmdbXSB7ICItdiIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICByZXR1cm4gdG9vbFZlcnNpb25TdGF0dXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUb29sVmVyc2lvbihJU3RhdHVzIHRvb2xWZXJzaW9uU3RhdHVzKSB7Ci0gICAgICAgIGlmICh0b29sVmVyc2lvblN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykgewotICAgICAgICAgICAgU3RyaW5nIGN4ZlRvb2xWZXJzaW9uID0gdG9vbFZlcnNpb25TdGF0dXMuZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgICAgICBjeGZUb29sVmVyc2lvbiA9IGN4ZlRvb2xWZXJzaW9uLnN1YnN0cmluZyhjeGZUb29sVmVyc2lvbi5pbmRleE9mKCItIikgKyAxLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGN4ZlRvb2xWZXJzaW9uLmxlbmd0aCgpKS50cmltKCk7Ci0KLSAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IGRpZ2l0UGF0dGVybi5tYXRjaGVyKGN4ZlRvb2xWZXJzaW9uKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IG1hdGNoZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gbWF0Y2hlci5lbmQoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gbWF0Y2hlci5lbmQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3hmUnVudGltZVR5cGUgPSBjeGZUb29sVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3RhcnQpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBjeGZSdW50aW1lVmVyc2lvbiA9IGN4ZlRvb2xWZXJzaW9uLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3hmVG9vbFZlcnNpb25MYWJlbC5zZXRUZXh0KGN4ZlJ1bnRpbWVUeXBlICsgIiAiICsgY3hmUnVudGltZVZlcnNpb24pOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldEN1cnJlbnRSdW50aW1lVmVyc2lvbihuZXcgVmVyc2lvbihjeGZSdW50aW1lVmVyc2lvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotICAgICAgICBDWEZQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAgICAgTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gaW5zdGFsbHMgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKTsKLSAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gQ1hGRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ1hGSW5zdGFsbCgpOwotICAgICAgICBpbnN0YWxsLnNldFZlcnNpb24oY3hmUnVudGltZVZlcnNpb24pOwotICAgICAgICBpbnN0YWxsLnNldExvY2F0aW9uKGN4ZkhvbWVEaXJUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIGluc3RhbGwuc2V0VHlwZShjeGZSdW50aW1lVHlwZSk7Ci0gICAgICAgIGluc3RhbGxzLnB1dChjeGZSdW50aW1lVmVyc2lvbiwgaW5zdGFsbCk7Ci0gICAgICAgIGNvbnRleHQuc2V0SW5zdGFsbGF0aW9ucyhpbnN0YWxscyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1ZDMzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2UwMDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gRmViIDAyIDExOjUwOjQyIEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0OGYyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVZlcnNpb246IDAuMS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVJlZ2lzdGVyQnVkZHk6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXhiLmNvcmUuSkFYQkNvcmVQbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwxLjEuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZQotSW1wb3J0LVBhY2thZ2U6IGphdmF4LmFjdGl2YXRpb24sCi0gamF2YXgueG1sLmJpbmQ7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbjt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQ7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuaGVscGVyczt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC51dGlsO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIG9yZy5hcGFjaGUueGVyY2VzLnV0aWwKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhMDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjkzZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODQ2OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUpBWEIgVG9vbHMgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBTaGFuZSBDbGFya2UgYW5kIG90aGVycyAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvaW5jdWJhdG9yL1xuXAotXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOWQ2MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1OTIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBKQVhCIENvcmUKLXBsdWdpbk5hbWU9SkFYQiBUb29scyBDb3JlIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotSkFYQl9DQVRFR09SWV9OQU1FPUpBWEIKLQotWE1MX1NDSEVNQV9UWVBFX1JVTEVTPVZhbGlkYXRpb24gcnVsZXMgZ292ZXJuaW5nIHRoZSB1c2Ugb2YgQFhtbFNjaGVtYVR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTczYTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5Ij4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSIlSkFYQl9DQVRFR09SWV9OQU1FIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb24iPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JPcmRlciIKLSAgICAgICAgICAgIG5hbWU9IlhtbEFjY2Vzc29yT3JkZXIiLz4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbEFjY2Vzc29yVHlwZSIvPgotICAgICAgCi0gICAgICA8IS0tIFRPRE8gUmVpbnN0YXRlIHdoZW4gWG1sQWRhcHRlciBpc3N1ZSBpcyBzb2x2ZWQKLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEFkYXB0ZXIiCi0gICAgICAgICAgICBuYW1lPSJYbWxBZGFwdGVyIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIC0tPgotICAgICAgCi0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGUiCi0gICAgICAgICAgICBuYW1lPSJYbWxBbnlBdHRyaWJ1dGUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55RWxlbWVudCIKLSAgICAgICAgICAgIG5hbWU9IlhtbEFueUVsZW1lbnQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0YWNobWVudFJlZiIKLSAgICAgICAgICAgIG5hbWU9IlhtbEF0dGFjaG1lbnRSZWYiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlIgotICAgICAgICAgICAgbmFtZT0iWG1sQXR0cmlidXRlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbGVtZW50Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsIgotICAgICAgICAgICAgbmFtZT0iWG1sRWxlbWVudERlY2wiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZiIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVsZW1lbnRSZWYiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZnMiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbGVtZW50UmVmcyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50V3JhcHBlciIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVsZW1lbnRXcmFwcGVyIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRzIgotICAgICAgICAgICAgbmFtZT0iWG1sRWxlbWVudHMiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bSIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVudW0iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bVZhbHVlIgotICAgICAgICAgICAgbmFtZT0iWG1sRW51bVZhbHVlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEIgotICAgICAgICAgICAgbmFtZT0iWG1sSUQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSURSRUYiCi0gICAgICAgICAgICBuYW1lPSJYbWxJRFJFRiI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJbmxpbmVCaW5hcnlEYXRhIgotICAgICAgICAgICAgbmFtZT0iWG1sSW5saW5lQmluYXJ5RGF0YSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIiCi0gICAgICAgICAgICBuYW1lPSJYbWxKYXZhVHlwZUFkYXB0ZXIiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVycyIKLSAgICAgICAgICAgIG5hbWU9IlhtbEphdmFUeXBlQWRhcHRlcnMiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTGlzdCIKLSAgICAgICAgICAgIG5hbWU9IlhtbExpc3QiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWltZVR5cGUiCi0gICAgICAgICAgICBuYW1lPSJYbWxNaW1lVHlwZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxNaXhlZCIKLSAgICAgICAgICAgIG5hbWU9IlhtbE1peGVkIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE5zIgotICAgICAgICAgICAgbmFtZT0iWG1sTnMiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnkiCi0gICAgICAgICAgICBuYW1lPSJYbWxSZWdpc3RyeSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudCIKLSAgICAgICAgICAgIG5hbWU9IlhtbFJvb3RFbGVtZW50Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYSIKLSAgICAgICAgICAgIG5hbWU9IlhtbFNjaGVtYSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlIgotICAgICAgICAgICAgbmFtZT0iWG1sU2NoZW1hVHlwZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlcyIKLSAgICAgICAgICAgIG5hbWU9IlhtbFNjaGVtYVR5cGVzIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc28iCi0gICAgICAgICAgICBuYW1lPSJYbWxTZWVBbHNvIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudCIKLSAgICAgICAgICAgIG5hbWU9IlhtbFRyYW5zaWVudCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlIgotICAgICAgICAgICAgbmFtZT0iWG1sVHlwZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbFZhbHVlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAgICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4Yi9jb3JlL0pBWEJDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmODgxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBKQVhCQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXhiLmNvcmUuSkFYQkNvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTkFNRV9ESUZGRVJFTlRfQ0FTRV9FWElTVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM7Ci0gCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX1NDSEVNQV9UWVBFX01VU1RfSEFWRV9ERUZBVUxUX09OX0ZJRUxEX09SX01FVEhPRDsKLQkKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKQVhCQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpBWEJDb3JlTWVzc2FnZXMoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4Yi9jb3JlL0pBWEJDb3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4MWJhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUgSW5jCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNKRFRVdGlscwotVFlQRV9OQU1FX0RJRkZFUkVOVF9DQVNFX0VYSVNUUz1BIFR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgY2FzZSBhbHJlYWR5IGV4aXN0cwotVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM9QSBjb21waWxhdGlvbiB1bml0IG5hbWVkICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gcGFja2FnZSAnJ3sxfScnCi1YTUxfU0NIRU1BX1RZUEVfTVVTVF9IQVZFX0RFRkFVTFRfT05fRklFTERfT1JfTUVUSE9EPUlmIEBYbWxTY2hlbWFUeXBlIGlzIHVzZWQgb24gYSBmaWVsZCBvciBhIG1ldGhvZCwgdGhlbiB0aGUgdmFsdWUgb2YgdHlwZSgpIG11c3QgYmUgREVGQVVMVC5jbGFzcyAoSkFYQiAyLjEsIDguNi40LjIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4Yi9jb3JlL0pBWEJDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZGI3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpBWEJDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvcmVQbHVnaW4gcGx1Z2luOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSkFYQkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBKQVhCQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgSkFYQkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBKQVhCQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIEpBWEJDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWEJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5NzcwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlMDAyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI01vbiBGZWIgMDIgMTE6NTA6NDIgR01UIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MWE2YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVZlcnNpb246IDAuNS4yLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVJlZ2lzdGVyQnVkZHk6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMS43LjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDEuMS4wKSIsCi0gamF2YXgueG1sLnNvYXA7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5hcGFjaGUueGVyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMi45LjAsMy4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscwotSW1wb3J0LVBhY2thZ2U6IGphdmF4LmFjdGl2YXRpb24sCi0gamF2YXguandzLAotIGphdmF4Lmp3cy5zb2FwLAotIGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLmhhbmRsZXI7dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXA7dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53cy5odHRwO3ZlcnNpb249IjIuMS4wIiwKLSBqYXZheC54bWwud3Muc29hcDt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLnNwaTt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLndzYWRkcmVzc2luZzt2ZXJzaW9uPSIyLjEuMCIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOTNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5tYXBwaW5ncyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxZWFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUpBWC1XUyBUb29scyAoSW5jdWJhdGlvbilcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOCwgMjAwOS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2luY3ViYXRvci9cblwKLVxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOWQ2MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhZDc3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNwcm9wZXJ0aWVzIGZpbGUgZm9yIEpBWFdTIENvcmUKLXBsdWdpbk5hbWU9SkFYLVdTIFRvb2xzIENvcmUgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1XRUJTRVJWSUNFX0NMQVNTX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SX1JVTEU9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRV9DTEFTU19QVUJMSUNfQUJTVFJBQ1RfRklOQUxfUlVMRT1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3QgYmUgYW4gb3V0ZXIgcHVibGljIGNsYXNzLCBtdXN0IG5vdCBiZSBmaW5hbCwgYW5kIG11c3Qgbm90IGJlIGFic3RyYWN0Ci1XRUJTRVJWSUNFX0NMQVNTX05PX0ZJTkFMSVpFX01FVEhPRF9SVUxFPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UgbXVzdCBub3QgZGVmaW5lIGEgZmluYWxpemUoKSBtZXRob2QKLVdFQk1FVEhPRF9PTkxZX1NVUFBPUlRFRF9PTl9DTEFTU0VTX1dJVEhfV0VCU0VSVklDRV9BTk5OT1RBVElPTj1AV2ViTWV0aG9kIGFubm90YXRpb25zIG9ubHkgc3VwcG9ydGVkIGluIGNsYXNzZXMgd2l0aCB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbgotV0VCU0VSVklDRV9TRUlfTk9fV0VCTUVUSE9TX1JVTEU9Tm8gQFdlYk1ldGhvZCBhbm5vdGF0aW9ucyBhbGxvd2VkIGluIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgY29udGFpbnMgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlIGluIGl0J3MgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbgotV0VCU0VSVklDRV9PTl9TRUlfQVRUUklCVVRFU19SVUxFPUNlcnRhaW4gQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIHdoZW4gdXNlZCBvbiBTRUkncwotV0VCU0VSVklDRV9XRUJTRVJWSUNFX1BST1ZJREVSX0NPRVhJU1RfUlVMRT1AV2ViU2VydmljZSBhbmQgQFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9ucyBjYW5ub3QgY29leGlzdAotT05FV0FZX05PX1JFVFVSTl9WQUxVRT1AT25ld2F5IG1ldGhvZHMgbXVzdCBub3QgcmV0dXJuIGEgdmFsdWUKLVdFQk1FVEhPRF9PTkxZX1BVQkxJQ19NRVRIT0RTPU1ldGhvZHMgYW5ub3RhdGVkIHdpdGggQFdlYk1ldGhvZCBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3Qgbm90IGJlIGRlY2xhcmVkIHN0YXRpYyBvciBmaW5hbAotU09BUEJJTkRJTkdfUlVMRVM9QFNPQVBCaW5kaW5nIFJ1bGVzLiBFbmNvZGVkIHVzZSBub3Qgc3VwcG9ydGVkLiBObyBSUEMgc3R5bGUgb24gbWV0aG9kcy4gTm8gbWl4aW5nIG9mIFNPQVBCaW5kaW5nIHN0eWxlcy4gUlBDIHN0eWxlIG9ubHkgd2l0aCB3cmFwcGVkIHBhcmFtZXRlciBzdHlsZQotV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX1JVTEU9QFdlYk1ldGhvZCBleGNsdWRlIGF0dHJpYnV0ZSBpcyBub3QgYWxsb3dlZCBpbiBTRUkncy4gSWYgc3BlY2lmaWVkIGluIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzLCB0aGVuIG90aGVyIGF0dHJpYnV0ZXMgaW4gdGhlIEBXZWJNZXRob2QgYW5ub3RhdGlvbiBhcmUgbm90IGFsbG93ZWQKLVNPQVBCSU5ESU5HX0RPQ1VNRU5UX0JBUkVfUlVMRVM9RG9jdW1lbnQgQmFyZSBvcGVyYXRpb25zIGFyZSBzdWJqZWN0IHRvIGEgbnVtYmVyIG9mIHJlc3RyaWN0aW9ucy4gQ29tYmluYXRpb25zIG9mIEBPbmV3YXkuIE5vdCBAT25ld2F5LiBWb2lkIFJldHVybi4gTm9uLVZvaWQgUmV0dXJuLiBAV2ViUGFyYW0gTW9kZXMgSU4sIE9VVCwgSU5PVVQuIEhlYWRlciBwYXJhbWV0ZXJzCi1IT0xERVJfVFlQRVNfUEFSQU1FVEVSU19SVUxFPVBhcmFtZXRlcnMgdGhhdCBjb25mb3JtIHRvIHRoZSBkZWZpbml0aW9uIG9mIEhvbGRlciBUeXBlcyBtdXN0IGJlIGFubm90YXRlZCB3aXRoIEBXZWJQYXJhbS5Nb2RlLk9VVCBvciBAV2ViUGFyYW0uTW9kZS5JTk9VVAotVU5JUVVFX05BTUVTX1JVTEU9Q2hlY2tzIEBSZXNwb25zZVdyYXBwZXIsIEBSZXF1ZXN0V3JhcHBlciBhbmQgQFdlYkZhdWx0IEJlYW5zIGZvciB1bmlxdWUgY2xhc3NOYW1lIGFuZCBmYXVsdEJlYW4gYXR0cmlidXRlcwotSEFORExFUkNIQUlOX1JVTEVTPUBIYW5kbGVyQ2hhaW4gYW5kIEBTT0FQTWVzc2FnZUhhbmRsZXJzIGFubm90YXRpb25zIGNhbm5vdCBjb2V4aXN0LiBASGFuZGxlckNoYWluIGFsbG93ZWQgb24gVFlQRSBvbmx5Ci1XRUJTRVJWSUNFUkVGU19SVUxFUz1FYWNoIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gaW5zaWRlIGEgQFdlYlNlcnZpY2VSZWZzIG11c3QgY29udGFpbiBuYW1lIGFuZCB0eXBlIGVsZW1lbnRzIHdpdGggbm9uLWRlZmF1bHQgdmFsdWVzCi1XRUJTRVJWSUNFX1RBUkdFVF9OQU1FU1BBQ0VfUlVMRT1DbGFzc2VzIG9yIEludGVyZmFjZXMgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aCBAamF2YXguandzLldlYlNlcnZpY2UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IG5hbWVzcGFjZQotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1JVTEU9VGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBtdXN0IHJlbWFpbiBjb25zaXN0ZW50IHdpdGggdGhlIHBvcnRUeXBlIGFuZCBiaW5kaW5ncyBkZWNsYXJlZCBpbiB0aGlzIFdTREwgcmVmZXJlbmNlZCBpbiB0aGUgQFdlYlNlcnZpY2Uud3NkbExvY2F0aW9uIGF0dHJpYnV0ZQotV0VCU0VSVklDRVBST1ZJREVSX1JVTEVTPUEgUHJvdmlkZXIgYmFzZWQgc2VydmljZSBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBtdXN0IGltcGxlbWVudCBhIHR5cGVkIFByb3ZpZGVyIGludGVyZmFjZSBhbmQgcHJvdmlkZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLgotSkFYV1NfQ0FURUdPUllfTkFNRT1KQVgtV1MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzMzNkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uQ2F0ZWdvcnkiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSIlSkFYV1NfQ0FURUdPUllfTkFNRSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXguandzLldlYk1ldGhvZCIKLSAgICAgICAgICAgIG5hbWU9IldlYk1ldGhvZCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5XZWJQYXJhbSIKLSAgICAgICAgICAgIG5hbWU9IldlYlBhcmFtIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXguandzLldlYlJlc3VsdCIKLSAgICAgICAgICAgIG5hbWU9IldlYlJlc3VsdCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5IYW5kbGVyQ2hhaW4iCi0gICAgICAgICAgICBuYW1lPSJIYW5kbGVyQ2hhaW4iPgotICAgICAgICAgPHRhcmdldEZpbHRlciB0YXJnZXQ9IkZJRUxEIi8+Ci0gICAgICAgICA8dGFyZ2V0RmlsdGVyIHRhcmdldD0iTUVUSE9EIi8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5PbmV3YXkiCi0gICAgICAgICAgICBuYW1lPSJPbmV3YXkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyIKLSAgICAgICAgICAgIG5hbWU9IlNPQVBCaW5kaW5nIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlciIKLSAgICAgICAgICAgIG5hbWU9IldlYlNlcnZpY2VQcm92aWRlciIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50IgotICAgICAgICAgICAgbmFtZT0iV2ViU2VydmljZUNsaWVudCIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmIgotICAgICAgICAgICAgbmFtZT0iV2ViU2VydmljZVJlZiIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmcyIKLSAgICAgICAgICAgIG5hbWU9IldlYlNlcnZpY2VSZWZzIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLlNlcnZpY2VNb2RlIgotICAgICAgICAgICAgbmFtZT0iU2VydmljZU1vZGUiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViRmF1bHQiCi0gICAgICAgICAgICBuYW1lPSJXZWJGYXVsdCIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5CaW5kaW5nVHlwZSIKLSAgICAgICAgICAgIG5hbWU9IkJpbmRpbmdUeXBlIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyIgotICAgICAgICAgICAgbmFtZT0iUmVxdWVzdFdyYXBwZXIiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyIgotICAgICAgICAgICAgbmFtZT0iUmVzcG9uc2VXcmFwcGVyIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLldlYkVuZHBvaW50IgotICAgICAgICAgICAgbmFtZT0iV2ViRW5kcG9pbnQiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmciCi0gICAgICAgICAgICBuYW1lPSJSZXNwZWN0QmluZGluZyIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmciCi0gICAgICAgICAgICBuYW1lPSJBZGRyZXNzaW5nIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLnNvYXAuTVRPTSIKLSAgICAgICAgICAgIG5hbWU9Ik1UT00iCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuRmF1bHRBY3Rpb24iCi0gICAgICAgICAgICBuYW1lPSJGYXVsdEFjdGlvbiI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5BY3Rpb24iCi0gICAgICAgICAgICBuYW1lPSJBY3Rpb24iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3Muc3BpLldlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbiIKLSAgICAgICAgICAgIG5hbWU9IldlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbiI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvciI+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLkhvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlSE9MREVSX1RZUEVTX1BBUkFNRVRFUlNfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5VbmlxdWVOYW1lc1J1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVVOSVFVRV9OQU1FU19SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFX0NMQVNTX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFX0NMQVNTX1BVQkxJQ19BQlNUUkFDVF9GSU5BTF9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9DTEFTU19OT19GSU5BTElaRV9NRVRIT0RfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlU0VJUmVzdHJpY3Rpb25zUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9TRUlfTk9fV0VCTUVUSE9TX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVNFSUFsbG93ZWRBdHRyaWJ1dGVzUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9PTl9TRUlfQVRUUklCVVRFU19SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAJJVdFQlNFUlZJQ0VfV0VCU0VSVklDRV9QUk9WSURFUl9DT0VYSVNUX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJNZXRob2QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0VfQU5OTk9UQVRJT04KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJNZXRob2QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQk1FVEhPRF9PTkxZX1BVQkxJQ19NRVRIT0RTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViTWV0aG9kIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViTWV0aG9kRXhjbHVkZVJ1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJNRVRIT0RfRVhDTFVERV9TUEVDSUZJRURfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLk9uZXdheSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLk9uZXdheVJ1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVPTkVXQVlfTk9fUkVUVVJOX1ZBTFVFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLlNPQVBCaW5kaW5nUnVsZXMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVNPQVBCSU5ESU5HX1JVTEVTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLlNPQVBCaW5kaW5nRG9jdW1lbnRCYXJlUnVsZXMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVNPQVBCSU5ESU5HX0RPQ1VNRU5UX0JBUkVfUlVMRVMKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5IYW5kbGVyQ2hhaW4iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5IYW5kbGVyQ2hhaW5SdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlSEFORExFUkNIQUlOX1JVTEVTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+ICAgICAKLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmcyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VSZWZzUnVsZXMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VSRUZTX1JVTEVTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2VSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFX1RBUkdFVF9OQU1FU1BBQ0VfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPiAgICAgCi0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VXU0RMTG9jYXRpb25SdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VQcm92aWRlclJ1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFUFJPVklERVJfUlVMRVMKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9KQVhXU0NvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTNhNWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEpBWFdTQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9OQU1FX0RJRkZFUkVOVF9DQVNFX0VYSVNUUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX1dJVEhfTkFNRV9BTFJFQURZX0VYSVNUUzsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBPTkVXQVlfTk9fUkVUVVJOX1ZBTFVFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ORVdBWV9OT19DSEVDS0VEX0VYQ0VQVElPTlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT05FV0FZX05PX0hPTERFUl9QQVJBTUVURVJTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlBBUkFNX01PREVfT1VUX0lOT1VUX0hPTERFUl9UWVBFOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhPTERFUl9UWVBFX01VU1RfQkVfT1VUX0lOT1VUOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ19CQVJFX05PTl9WT0lEX1JFVFVSTl9OT19JTk9VVF9PVVRfUEFSQU1FVEVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9JTl9QQVJBTUVURVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX09VVF9QQVJBTUVURVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQU5ETEVSX0NIQUlOX1NPQVBfTUVTU0FHRV9IQU5ETEVSUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQU5ETEVSX0NIQUlOX09OX0ZJRUxEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhBTkRMRVJfQ0hBSU5fT05fTUVUSE9EOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVJFRlNfTkFNRV9SRVFVSVJFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFUkVGU19UWVBFX1JFUVVJUkVEOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCUEFSQU1fTkFNRV9SRVFVSVJFRF9XSEVOX0RPQ19CQVJFX09VVF9JTk9VVDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX05PX0ZJTkFMX01PRElGSUVSX0FMTE9XRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX0VYQ0xVREVfTk9UX0FMTE9XRURfT05fU0VJOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX09WRVJSSURFX0ZJTkFMSVpFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5EUE9JTlRJTlRFUkZBQ0VfU0VJOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfUE9SVE5BTUVfU0VJOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfU0VSVklDRU5BTUVfU0VJOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5UOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9SRURVQ0VEX1ZJU0lCSUxJVFk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX0lOQ09NUEFUSUJMRV9SRVRVUk5fVFlQRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0lOVEVSRkFDRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfQU5OT1RBVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfUFVCTElDOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJNRVRIT0RTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfT1VURVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19TT0FQQklORElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUkVTVUxUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fT05FV0FZOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XRUJTRVJWSUNFUFJPVklERVJfQ09NQklOQVRJT047Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fVU5BQkxFX1RPX0xPQ0FURTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fUE9SVF9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19TRVJWSUNFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX09QRVJUQVRJT05fTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fV1NETF9PUEVSQVRJT05fT1VUUFVUX01FVEhPRF9PTkVXQVk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1NPQVBfQklORElOR19TVFlMRTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19OT19SUENfU1RZTEVfT05fTUVUSE9EUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBCSU5ESU5HX0RPQ1VNRU5UX0VOQ09ERURfTk9UX1NVUFBPUlRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19OT19NSVhFRF9CSU5ESU5HUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19SUENfTk9fQkFSRV9QQVJBTUVURVJfU1RZTEU7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VQUk9WSURFUl9JTVBMRU1FTlRfVFlQRURfUFJPVklERVJfSU5URVJGQUNFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9TT0FQQklORElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFUFJPVklERVJfU09BUE1FU1NBR0VfTUVTU0FHRV9NT0RFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX0hUVFBCSU5ESU5HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX01FU1NBR0VfTU9ERTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBPUEVSQVRJT05fTkFNRVNfTVVTVF9CRV9VTklRVUVfRVJST1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1JBUFBFUl9GQVVMVF9CRUFOX05BTUVTX01VU1RfQkVfVU5JUVVFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ19CQVJFX01FVEhPRFNfVU5JUVVFX1hNTF9FTEVNRU5UUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBTF9OQU1FX0FUVFJJQlVURVNfTVVTVF9CRV9VTklRVUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WQUxJRF9OQU1FX0FUVFJJQlVURTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQQVJBTUVURVJfTkFNRV9DTEFTSDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBHRU5FUkFURURfUEFSQU1FVEVSX05BTUVfQ0xBU0g7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSkFYV1NDb3JlTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgSkFYV1NDb3JlTWVzc2FnZXMoKSB7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9KQVhXU0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzg3NDE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI0pEVFV0aWxzCi1UWVBFX05BTUVfRElGRkVSRU5UX0NBU0VfRVhJU1RTPUEgVHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudCBjYXNlIGFscmVhZHkgZXhpc3RzCi1UWVBFX1dJVEhfTkFNRV9BTFJFQURZX0VYSVNUUz1BIGNvbXBpbGF0aW9uIHVuaXQgbmFtZWQgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cyBpbiBwYWNrYWdlICcnezF9JycKLQotV0VCU0VSVklDRV9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUj1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3QgaGF2ZSBhIGRlZmF1bHQgcHVibGljIGNvbnN0cnVjdG9yCi1XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTD1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3QgYmUgYW4gb3V0ZXIgcHVibGljIGNsYXNzLCBtdXN0IG5vdCBiZSBmaW5hbCwgYW5kIG11c3Qgbm90IGJlIGFic3RyYWN0Ci1XRUJTRVJWSUNFX09WRVJSSURFX0ZJTkFMSVpFPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UgbXVzdCBub3QgZGVmaW5lIGEgZmluYWxpemUoKSBtZXRob2QKLVdFQk1FVEhPRF9PTkxZX1NVUFBPUlRFRF9PTl9DTEFTU0VTX1dJVEhfV0VCU0VSVklDRT1AV2ViTWV0aG9kIGlzIG9ubHkgc3VwcG9ydGVkIG9uIGNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UKLVdFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTPUBXZWJNZXRob2QgYW5ub3RhdGlvbiBpcyBub3QgYWxsb3dlZCBvbiBub24tcHVibGljIG1ldGhvZHMKLVdFQk1FVEhPRF9OT19GSU5BTF9NT0RJRklFUl9BTExPV0VEPUBXZWJNZXRob2QgYW5ub3RhdGlvbiBpcyBub3QgYWxsb3dlZCBvbiBmaW5hbCBtZXRob2RzCi1XRUJNRVRIT0RfTk9fU1RBVElDX01PRElGSUVSX0FMTE9XRUQ9QFdlYk1ldGhvZCBhbm5vdGF0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIHN0YXRpYyBtZXRob2RzCi1XRUJNRVRIT0RfRVhDTFVERV9TUEVDSUZJRURfTk9fT1RIRVJfQVRUUklCVVRFU19BTExPV0VEPUBXZWJNZXRob2QgZXhjbHVkZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLiBObyBvdGhlciBhdHRyaWJ1dGVzIGFsbG93ZWQKLVdFQk1FVEhPRF9FWENMVURFX05PVF9BTExPV0VEX09OX1NFST1AV2ViTWV0aG9kIGFubm90YXRpb25zIGluIFNFSSdzIGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IHRoZSBleGNsdWRlIGF0dHJpYnV0ZQotV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUk9QFdlYlNlcnZpY2Ugc2VydmljZU5hbWUgZWxlbWVudCBpcyBub3QgYWxsb3dlZCBvbiBTRUkKLVdFQlNFUlZJQ0VfRU5EUE9JTlRJTlRFUkZBQ0VfU0VJPUBXZWJTZXJ2aWNlIGVuZHBvaW50SW50ZXJmYWNlIGVsZW1lbnQgaXMgbm90IGFsbG93ZWQgb24gU0VJCi1XRUJTRVJWSUNFX1BPUlROQU1FX1NFST1AV2ViU2VydmljZSBwb3J0TmFtZSBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIG9uIFNFSQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5UPUltcGxlbWVudGF0aW9uIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBTRUkgbWV0aG9kICcnezB9JycKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9SRURVQ0VEX1ZJU0lCSUxJVFk9Q2Fubm90IHJlZHVjZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgU0VJIG1ldGhvZAotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX0lOQ09NUEFUSUJMRV9SRVRVUk5fVFlQRT1UaGUgcmV0dXJuIHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggezB9Ci1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0lOVEVSRkFDRT1UaGUgZW5kcG9pbnRJbnRlcmZhY2UgJyd7MH0nJyBtdXN0IGJlIGFuIEludGVyZmFjZQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9GT1VORD1UaGUgZW5kcG9pbnRJbnRlcmZhY2UgJyd7MH0nJyBjYW5ub3QgYmUgZm91bmQKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfQU5OT1RBVEVEPVRoZSBlbmRwb2ludEludGVyZmFjZSAnJ3swfScnIG11c3QgYmUgYW5ub3RhdGVkIHdpdGggQGphdmF4Lmp3cy5XZWJTZXJ2aWNlCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX1BVQkxJQz1UaGUgZW5kcG9pbnRJbnRlcmZhY2UgJyd7MH0nJyBtdXN0IGJlIHB1YmxpYwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9PVVRFUj1UaGUgZW5kcG9pbnRJbnRlcmZhY2UgJyd7MH0nJyBtdXN0IGJlIGFuIG91dGVyIGludGVyZmFjZQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFPUBXZWJTZXJ2aWNlIGFubm90YXRpb24gY29udGFpbnMgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlLiBObyBuYW1lIGF0dHJpYnV0ZSBhbGxvd2VkCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCTUVUSE9EUz1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAV2ViTWV0aG9kIGFsbG93ZWQgaW4gaW1wbGVtZW50YXRpb24gY2xhc3MKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19TT0FQQklORElORz1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gQFNPQVBCaW5kaW5nIG5vdCBhbGxvd2VkIGluIGltcGxlbWVudGF0aW9uIGNsYXNzCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUkVTVUxUPUBXZWJTZXJ2aWNlIGFubm90YXRpb24gY29udGFpbnMgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlLiBObyBtZXRob2RzIGFubm90YXRlZCB3aXRoIEBXZWJSZXN1bHQgYWxsb3dlZCBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlBBUkFNPUBXZWJTZXJ2aWNlIGFubm90YXRpb24gY29udGFpbnMgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlLiBObyBwYXJhbWV0ZXJzIGFubm90YXRlZCB3aXRoIEBXZWJQYXJhbSBhbGxvd2VkIGluIGltcGxlbWVudGF0aW9uIGNsYXNzCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fT05FV0FZPUBXZWJTZXJ2aWNlIGFubm90YXRpb24gY29udGFpbnMgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlLiBObyBtZXRob2RzIGFubm90YXRlZCB3aXRoIEBPbmV3YXkgYWxsb3dlZCBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcwotV0VCU0VSVklDRV9XRUJTRVJWSUNFUFJPVklERVJfQ09NQklOQVRJT049QFdlYlNlcnZpY2UgYW5kIEBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbnMgY2Fubm90IGJlIGNvbWJpbmVkCi1XRUJTRVJWSUNFX0RFRkFVTFRfUEFDS0FHRV9UQVJHRVRfTkFNRVNQQUNFPUNsYXNzZXMgb3IgSW50ZXJmYWNlcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlIHRoYXQgYXJlIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3Qgc3BlY2lmeSBhIHRhcmdldE5hbWVzcGFjZSBhdHRyaWJ1dGUKLU9ORVdBWV9OT19SRVRVUk5fVkFMVUU9QE9uZXdheSBtZXRob2RzIG11c3Qgbm90IHJldHVybiBhIHZhbHVlCi1PTkVXQVlfTk9fQ0hFQ0tFRF9FWENFUFRJT05TPUBPbmV3YXkgbWV0aG9kcyBtdXN0IG5vdCBkZWNsYXJlIGFueSBjaGVja2VkIGV4Y2VwdGlvbnMKLU9ORVdBWV9OT19IT0xERVJfUEFSQU1FVEVSUz1AT25ld2F5IG1ldGhvZHMgbXVzdCBub3QgYWNjZXB0IGFueSBqYXZheC54bWwud3MuSG9sZGVyPFQ+IHBhcmFtZXRlcnMuIAotV0VCUEFSQU1fTU9ERV9PVVRfSU5PVVRfSE9MREVSX1RZUEU9VGhlIEBXZWJQYXJhbS5Nb2RlLk9VVCBhbmQgQFdlYlBhcmFtLk1vZGUuSU5PVVQgbW9kZXMgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBqYXZheC54bWwud3MuSG9sZGVyPFQ+IHBhcmFtZXRlcnMKLUhPTERFUl9UWVBFX01VU1RfQkVfT1VUX0lOT1VUPWphdmF4LnhtbC53cy5Ib2xkZXI8VD4gcGFyYW1ldGVycyBtdXN0IGJlIEBXZWJQYXJhbS5Nb2RlLk9VVCBvciBAV2ViUGFyYW0uTW9kZS5JTk9VVAotU09BUEJJTkRJTkdfTk9fUlBDX1NUWUxFX09OX01FVEhPRFM9UlBDIHN0eWxlIEBTT0FQQmluZGluZyBhbm5vdGF0aW9ucyBub3Qgc3VwcG9ydGVkIG9uIG1ldGhvZHMKLVNPQVBCSU5ESU5HX1JQQ19FTkNPREVEX05PVF9TVVBQT1JURUQ9UlBDIEVuY29kZWQgU09BUCBCaW5kaW5ncyBub3Qgc3VwcG9ydGVkCi1TT0FQQklORElOR19ET0NVTUVOVF9FTkNPREVEX05PVF9TVVBQT1JURUQ9RG9jdW1lbnQgRW5jb2RlZCBTT0FQIEJpbmRpbmdzIG5vdCBzdXBwb3J0ZWQKLVNPQVBCSU5ESU5HX05PX01JWEVEX0JJTkRJTkdTPU1peGVkIFJQQyBhbmQgRG9jdW1lbnQgc3R5bGUgb3BlcmF0aW9ucyBub3QgcGVybWl0dGVkIGluIHRoZSBzYW1lIHNlcnZpY2UKLVNPQVBCSU5ESU5HX1JQQ19OT19CQVJFX1BBUkFNRVRFUl9TVFlMRT1Vc2Ugb2YgUlBDIHN0eWxlIHJlcXVpcmVzIHVzZSBvZiBXUkFQUEVEIHBhcmFtZXRlciBzdHlsZQotRE9DX0JBUkVfT05MWV9PTkVfTk9OX0hFQURFUl9JTl9QQVJBTUVURVI9RG9jdW1lbnQgbGl0ZXJhbCBiYXJlIG1ldGhvZHMgbWF5IGhhdmUgb25seSBvbmUgbm9uLWhlYWRlciBJTiBwYXJhbWV0ZXIKLURPQ19CQVJFX05PTl9WT0lEX1JFVFVSTl9OT19JTk9VVF9PVVRfUEFSQU1FVEVSPURvY3VtZW50IGxpdGVyYWwgYmFyZSBtZXRob2RzIHRoYXQgZGVjbGFyZSBhIG5vbi12b2lkIHJldHVybiB2YWx1ZSBtYXkgbm90IGhhdmUgYW55IE9VVCBvciBJTk9VVCBwYXJhbWV0ZXJzCi1ET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfSU5fUEFSQU1FVEVSPURvY3VtZW50IGxpdGVyYWwgYmFyZSBtZXRob2RzIHRoYXQgZGVjbGFyZSBhIHZvaWQgcmV0dXJuIHZhbHVlIG1heSBoYXZlIG9ubHkgb25lIElOL0lOT1VUIHBhcmFtZXRlcgotRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX09VVF9QQVJBTUVURVI9RG9jdW1lbnQgbGl0ZXJhbCBiYXJlIG1ldGhvZHMgdGhhdCBkZWNsYXJlIGEgdm9pZCByZXR1cm4gdmFsdWUgbWF5IGhhdmUgb25seSBvbmUgT1VUL0lOT1VUIHBhcmFtZXRlcgotV0VCUEFSQU1fTkFNRV9SRVFVSVJFRF9XSEVOX0RPQ19CQVJFX09VVF9JTk9VVD1UaGUgQFdlYlBhcmFtIG5hbWUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBEb2N1bWVudCBCYXJlIGFuZCB0aGUgbW9kZSBpcyBPVVQgb3IgSU5PVVQKLU9QRVJBVElPTl9OQU1FU19NVVNUX0JFX1VOSVFVRV9FUlJPUj1PcGVyYXRpb24gbmFtZXMgbXVzdCBiZSB1bmlxdWUgOiAnJ3swfScnCi1XUkFQUEVSX0ZBVUxUX0JFQU5fTkFNRVNfTVVTVF9CRV9VTklRVUU9R2VuZXJhdGVkIFJlcXVlc3QvUmVzcG9uc2UgYW5kIEZhdWx0IGJlYW4gY2xhc3NlcyBtdXN0IGhhdmUgdW5pcXVlIG5hbWVzIHdpdGhpbiBhIHBhY2thZ2UgYW5kIG11c3Qgbm90IGNsYXNoIHdpdGggb3RoZXIgY2xhc3NlcyBpbiB0aGF0IHBhY2thZ2UgOiAnJ3swfScnCi1ET0NfQkFSRV9NRVRIT0RTX1VOSVFVRV9YTUxfRUxFTUVOVFM9RG9jdW1lbnQgTGl0ZXJhbCBCYXJlIG9wZXJhdGlvbnMgbXVzdCBoYXZlIHVuaXF1ZSBYTUwgZWxlbWVudHMgZm9yIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1lc3NhZ2VzIGFjcm9zcyBhbGwgb3BlcmF0aW9ucyBvbiB0aGUgV2ViIFNlcnZpY2UgOiAnJ3swfScnCi1MT0NBTF9OQU1FX0FUVFJJQlVURVNfTVVTVF9CRV9VTklRVUU9VGhlIHdyYXBwZXIgYmVhbiBsb2NhbE5hbWUgYXR0cmlidXRlcyBtdXN0IGJlIHVuaXF1ZSA6ICcnezB9JycKLUlOVkFMSURfTkFNRV9BVFRSSUJVVEU9VGhlIG5hbWUgJyd7MH0nJyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMKLVdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFPVVuYWJsZSB0byBsb2NhdGUgd3NkbCBhdCB3c2RsTG9jYXRpb246ICcnezB9JycKLVdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19QT1JUX05BTUU9Tm8gd3NkbDpwb3J0IG1hdGNoaW5nIHRoZSBwb3J0TmFtZSAnJ3swfScnIGNhbiBiZSBmb3VuZCBpbiB0aGUgV1NETCAnJ3sxfScnCi1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fU0VSVklDRV9OQU1FPU5vIHdzZGw6c2VydmljZSBtYXRjaGluZyB0aGUgc2VydmljZU5hbWUgJyd7MH0nJyBjYW4gYmUgZm91bmQgaW4gdGhlIFdTREwgJyd7MX0nJwotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX09QRVJUQVRJT05fTkFNRT1ObyBAV2ViTWV0aG9kIG1hdGNoaW5nIHRoZSB3c2RsOm9wZXJhdGlvbiAnJ3swfScnIGNhbiBiZSBmb3VuZAotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1dTRExfT1BFUkFUSU9OX09VVFBVVF9NRVRIT0RfT05FV0FZPVRoZSBNZXRob2QgJyd7MH0nJyBpcyBhbm5vdGF0ZWQgQE9uZXdheSBidXQgdGhlIHdzZGw6b3BlcmF0aW9uICcnezB9Jycgc3BlY2lmaWVzIGEgd3NkbDpvdXRwdXQgZWxlbWVudAotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1NPQVBfQklORElOR19TVFlMRT1UaGUgd3NkbCAnJ3swfScnIHNwZWNpZmllcyBhICcnezF9JycgU09BUCBiaW5kaW5nIHN0eWxlIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSAnJ3syfScnIFNPQVAgYmluZGluZyBzdHlsZSBvZiB0aGUgd2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24vU0VJCi1QQVJBTUVURVJfTkFNRV9DTEFTSD1QYXJhbWV0ZXIgbmFtZXMgbXVzdCBiZSB1bmlxdWU6ICcnezB9JycKLUdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSD1QYXJhbWV0ZXIgTmFtZSAnJ3swfScnIHdpbGwgY2xhc2ggd2l0aCBhIGdlbmVyYXRlZCBwYXJhbWV0ZXIgbmFtZQotSEFORExFUl9DSEFJTl9TT0FQX01FU1NBR0VfSEFORExFUlM9QEhhbmRsZXJDaGFpbiBhbmQgQFNPQVBNZXNzYWdlSGFuZGxlcnMgY2Fubm90IGJlIGNvbWJpbmVkCi1IQU5ETEVSX0NIQUlOX09OX0ZJRUxEPVRoZSBASGFuZGxlckNoYWluIGFubm90YXRpb24gbWF5IG9ubHkgYmUgc3BlY2lmaWVkIG9uIGEgVFlQRS4gVGhlIGFubm90YXRpb24gdGFyZ2V0IGluY2x1ZGVzIEZJRUxEIGZvciB1c2UgYnkgSkFYLVdTIDIuMAotSEFORExFUl9DSEFJTl9PTl9NRVRIT0Q9VGhlIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBtYXkgb25seSBiZSBzcGVjaWZpZWQgb24gYSBUWVBFLiBUaGUgYW5ub3RhdGlvbiB0YXJnZXQgaW5jbHVkZXMgTUVUSE9EIGZvciB1c2UgYnkgSkFYLVdTIDIuMAotV0VCU0VSVklDRVJFRlNfTkFNRV9SRVFVSVJFRD1FYWNoIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gaW5zaWRlIGEgQFdlYlNlcnZpY2VSZWZzIG11c3QgY29udGFpbiBhIG5hbWUgZWxlbWVudCB3aXRoIGEgbm9uLWRlZmF1bHQgKCIiKSB2YWx1ZQotV0VCU0VSVklDRVJFRlNfVFlQRV9SRVFVSVJFRD1FYWNoIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gaW5zaWRlIGEgQFdlYlNlcnZpY2VSZWZzIG11c3QgY29udGFpbiBhIHR5cGUgZWxlbWVudCB3aXRoIGEgbm9uLWRlZmF1bHQgKE9iamVjdC5jbGFzcykgdmFsdWUKLVdFQlNFUlZJQ0VQUk9WSURFUl9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUj1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlUHJvdmlkZXIgbXVzdCBoYXZlIGEgZGVmYXVsdCBwdWJsaWMgY29uc3RydWN0b3IKLVdFQlNFUlZJQ0VQUk9WSURFUl9JTVBMRU1FTlRfVFlQRURfUFJPVklERVJfSU5URVJGQUNFPUEgUHJvdmlkZXIgYmFzZWQgZW5kcG9pbnQgaW1wbGVtZW50YXRpb24gbXVzdCBpbXBsZW1lbnQgYSB0eXBlZCBqYXZheC54bWwud3MuUHJvdmlkZXIgaW50ZXJmYWNlLiBQcm92aWRlciBpbXBsZW1lbnRhdGlvbnMgd29yayB3aXRoIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2Ygb2JqZWN0czogamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UsIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIGFuZCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UKLVdFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9TT0FQQklORElORz1qYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZSBvYmplY3RzIHJlcXVpcmUgdGhlIFByb3ZpZGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZSB0aGUgU09BUCBCaW5kaW5nCi1XRUJTRVJWSUNFUFJPVklERVJfU09BUE1FU1NBR0VfTUVTU0FHRV9NT0RFPWphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIG9iamVjdHMgcmVxdWlyZSB0aGUgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gc3BlY2lmeSBhIEBqYXZheC54bWwud3MuU2VydmljZU1vZGUgYW5ub3RhdGlvbiB3aXRoIGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGUuTUVTU0FHRSBhcyB0aGUgdmFsdWUgCi1XRUJTRVJWSUNFUFJPVklERVJfREFUQVNPVVJDRV9IVFRQQklORElORz1qYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UgZGVyaXZlZCBvYmplY3RzIHJlcXVpcmUgdGhlIFByb3ZpZGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZSB0aGUgSFRUUCBCaW5kaW5nCi1XRUJTRVJWSUNFUFJPVklERVJfREFUQVNPVVJDRV9NRVNTQUdFX01PREU9amF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlIGRlcml2ZWQgb2JqZWN0cyByZXF1aXJlIHRoZSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbiB0byBzcGVjaWZ5IGEgQGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSBhbm5vdGF0aW9uIHdpdGggamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZS5NRVNTQUdFIGFzIHRoZSB2YWx1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTI3ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYV1NDb3JlUGx1Z2luIHBsdWdpbjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEpBWFdTQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgSkFYV1NDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSGFuZGxlckNoYWluUnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSGFuZGxlckNoYWluUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZmU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hhbmRsZXJDaGFpblJ1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgSGFuZGxlckNoYWluUnVsZXMgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oSGFuZGxlckNoYWluLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguandzLnNvYXAuU09BUE1lc3NhZ2VIYW5kbGVycy5jbGFzcyk7DQotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTWlycm9yICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGFubm90YXRpb25NaXJyb3IuZ2V0UG9zaXRpb24oKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9TT0FQX01FU1NBR0VfSEFORExFUlMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguandzLkhhbmRsZXJDaGFpbi5jbGFzcyk7DQotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoYW5ub3RhdGlvbk1pcnJvci5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkhBTkRMRVJfQ0hBSU5fT05fRklFTEQpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgew0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5qd3MuSGFuZGxlckNoYWluLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uTWlycm9yLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9PTl9NRVRIT0QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9Ib2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4ZWQyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci0KLXB1YmxpYyBjbGFzcyBIb2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1ldGVycygoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVBhcmFtZXRlcnMoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzSG9sZGVyUGFyYW1ldGVyID0gdHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNXZWJQYXJhbU91dElub3V0TW9kZShwYXJhbWV0ZXIpICYmICFpc0hvbGRlclBhcmFtZXRlcikgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHBhcmFtZXRlci5nZXRQb3NpdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCUEFSQU1fTU9ERV9PVVRfSU5PVVRfSE9MREVSX1RZUEUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNIb2xkZXJQYXJhbWV0ZXIgJiYgaXNXZWJQYXJhbUluTW9kZShwYXJhbWV0ZXIpKXsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihwYXJhbWV0ZXIuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5IT0xERVJfVFlQRV9NVVNUX0JFX09VVF9JTk9VVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlBhcmFtSW5Nb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBTdHJpbmcgbW9kZSA9IGdldE1vZGUocGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1vZGUuZXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlBhcmFtT3V0SW5vdXRNb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBTdHJpbmcgbW9kZSA9IGdldE1vZGUocGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1vZGUuZXF1YWxzKFdlYlBhcmFtLk1vZGUuT1VULm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoV2ViUGFyYW0uTW9kZS5JTk9VVC5uYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRNb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlBhcmFtLCBNT0RFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vT25ld2F5UnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vT25ld2F5UnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlNzY0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL09uZXdheVJ1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci0KLXB1YmxpYyBjbGFzcyBPbmV3YXlSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKE9uZXdheS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgeyAgICAgICAgCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKS5lcXVhbHMoZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0Vm9pZFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGFubm90YXRpb25EZWNsYXJhdGlvbiwgbWV0aG9kRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuT05FV0FZX05PX1JFVFVSTl9WQUxVRSk7IAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24uZ2V0VGhyb3duVHlwZXMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fQ0hFQ0tFRF9FWENFUFRJT05TKTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1ldGVycyhtZXRob2REZWNsYXJhdGlvbiwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY2hlY2tQYXJhbWV0ZXJzKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLAotICAgICAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICBUeXBlTWlycm9yIHR5cGVNaXJyb3IgPSBlbnZpcm9ubWVudC5nZXRUeXBlVXRpbHMoKS5nZXRFcmFzdXJlKHBhcmFtZXRlci5nZXRUeXBlKCkpOwotICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IudG9TdHJpbmcoKS5lcXVhbHMoSG9sZGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKGFubm90YXRpb25EZWNsYXJhdGlvbiwgbWV0aG9kRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fSE9MREVSX1BBUkFNRVRFUlMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vU09BUEJpbmRpbmdEb2N1bWVudEJhcmVSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ0RvY3VtZW50QmFyZVJ1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmNjYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ0RvY3VtZW50QmFyZVJ1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5IRUFERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTU9ERTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKLQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nRG9jdW1lbnRCYXJlUnVsZXMgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihTT0FQQmluZGluZy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYW5ub3RhdGlvbk1pcnJvcnMgPSB0eXBlRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgbWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLmdldERlY2xhcmF0aW9uKCkuZXF1YWxzKGFubm90YXRpb25EZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKG1pcnJvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kRGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NNZXRob2QobWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIG1pcnJvciA6IGFubm90YXRpb25NaXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXJyb3IuZ2V0QW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJhdGlvbigpLmVxdWFscyhhbm5vdGF0aW9uRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSkFYV1NVdGlscy5pc0RvY3VtZW50QmFyZShtaXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01ldGhvZChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTWV0aG9kKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgLy9AT25ld2F5IG9wZXJhdGlvbnMKLSAgICAgICAgaWYgKGlzT25ld2F5KG1ldGhvZERlY2xhcmF0aW9uKSAmJiAhaXNTaW5nbGVOb25IZWFkZXJJTlBhcmFtZXRlcihwYXJhbWV0ZXJzKSkgewotICAgICAgICAgICAgcHJpbnRFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpc1ZvaWRSZXR1cm5UeXBlKG1ldGhvZERlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIGlmIChjb3VudElOUGFyYW1ldGVycyhwYXJhbWV0ZXJzKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9JTl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY291bnRPVVRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpID4gMSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX09VVF9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50SU5QYXJhbWV0ZXJzKHBhcmFtZXRlcnMpID4gMSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9PTkxZX09ORV9OT05fSEVBREVSX0lOX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb3VudE9VVFBhcmFtZXRlcnMocGFyYW1ldGVycykgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX05PTl9WT0lEX1JFVFVSTl9OT19JTk9VVF9PVVRfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL2NoZWNrIGZvciBAV2ViUGFyYW0ubmFtZSBhdHRyaWJ1dGUgd2hlbiBAV2ViUGFyYW0uTW9kZSA9IE9VVCBvciBJTk9VVAotLy8gICAgICAgIGZvcihQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLS8vICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sIFdlYlBhcmFtLmNsYXNzKTsKLS8vICAgICAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUoYW5ub3RhdGlvbk1pcnJvciwgcGFyYW1ldGVyRGVjbGFyYXRpb24pOwotLy8gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgTkFNRSk7Ci0vLwotLy8gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiAobW9kZS5lcXVhbHMoTW9kZS5PVVQubmFtZSgpKSB8fCBtb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uTWlycm9yLmdldFBvc2l0aW9uKCksCi0vLyAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCUEFSQU1fTkFNRV9SRVFVSVJFRF9XSEVOX0RPQ19CQVJFX09VVF9JTk9VVCk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT25ld2F5KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igb25ld2F5ID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIE9uZXdheS5jbGFzcyk7Ci0gICAgICAgIGlmIChvbmV3YXkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZvaWRSZXR1cm5UeXBlKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCkuZXF1YWxzKGVudmlyb25tZW50LmdldFR5cGVVdGlscygpLmdldFZvaWRUeXBlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NpbmdsZU5vbkhlYWRlcklOUGFyYW1ldGVyKENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgcmV0dXJuIGNvdW50Tm9uSGVhZGVySU5QYXJhbWV0ZXJzKHBhcmFtZXRlcnMpIDw9IDE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY291bnROb25IZWFkZXJJTlBhcmFtZXRlcnMoQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBpbnQgaW5Ob25IZWFkZXJQYXJhbWV0ZXJzID0gMDsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGlmIChpc05vbkhlYWRlcklOUGFyYW1ldGVyKHBhcmFtZXRlckRlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIGluTm9uSGVhZGVyUGFyYW1ldGVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbk5vbkhlYWRlclBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTm9uSGVhZGVySU5QYXJhbWV0ZXIoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V2ViUGFyYW1Nb2RlKHdlYlBhcmFtLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuSU4ubmFtZSgpKQotICAgICAgICAgICAgICAmJiAhaXNIZWFkZXIod2ViUGFyYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pLmVxdWFscyhNb2RlLklOLm5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvdW50SU5QYXJhbWV0ZXJzKENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgaW50IGluTm9uSGVhZGVyUGFyYW1ldGVycyA9IDA7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAoaXNJTlBhcmFtZXRlcihwYXJhbWV0ZXJEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBpbk5vbkhlYWRlclBhcmFtZXRlcnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5Ob25IZWFkZXJQYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0lOUGFyYW1ldGVyKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICBpZiAod2ViUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAobW9kZS5lcXVhbHMoTW9kZS5JTi5uYW1lKCkpIHx8IG1vZGUuZXF1YWxzKE1vZGUuSU5PVVQubmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgIWlzSGVhZGVyKHdlYlBhcmFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBkZWZhdWx0TW9kZSA9IGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICBpZiAoZGVmYXVsdE1vZGUuZXF1YWxzKE1vZGUuSU4ubmFtZSgpKSB8fCBkZWZhdWx0TW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb3VudE9VVFBhcmFtZXRlcnMoQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBpbnQgb3V0Tm9uSGVhZGVyUGFyYW1ldGVycyA9IDA7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAoaXNPVVRQYXJhbWV0ZXIocGFyYW1ldGVyRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgb3V0Tm9uSGVhZGVyUGFyYW1ldGVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXROb25IZWFkZXJQYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc09VVFBhcmFtZXRlcihQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtb2RlID0gZ2V0V2ViUGFyYW1Nb2RlKHdlYlBhcmFtLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gKG1vZGUuZXF1YWxzKE1vZGUuT1VULm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAmJiAhaXNIZWFkZXIod2ViUGFyYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0hlYWRlcihBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IpIHsKLSAgICAgICAgQm9vbGVhbiBoZWFkZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGFubm90YXRpb25NaXJyb3IsIEhFQURFUik7Ci0gICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICByZXR1cm4gaGVhZGVyLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRXZWJQYXJhbU1vZGUoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yLCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbikgewotICAgICAgICBTdHJpbmcgbW9kZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBNT0RFKTsKLSAgICAgICAgaWYgKG1vZGUgPT0gbnVsbCB8fCBtb2RlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1vZGUgPSBnZXREZWZhdWx0V2ViUGFyYW1Nb2RlKHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0V2ViUGFyYW1Nb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFR5cGVNaXJyb3IgdHlwZU1pcnJvciA9IGVudmlyb25tZW50LmdldFR5cGVVdGlscygpLmdldEVyYXN1cmUocGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpKTsKLSAgICAgICAgaWYgKHR5cGVNaXJyb3IudG9TdHJpbmcoKS5lcXVhbHMoSG9sZGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBNb2RlLklOT1VULm5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTW9kZS5JTi5uYW1lKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nUnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vU09BUEJpbmRpbmdSdWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg3OWQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vU09BUEJpbmRpbmdSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QQVJBTUVURVJfU1RZTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU1RZTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVVNFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ1J1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIHNvYXBCaW5kaW5nRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFNPQVBCaW5kaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHNvYXBCaW5kaW5nRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgY2hlY2tGb3JFbmNvZGVkVXNlKGRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIGNoZWNrRm9yUlBDQmFyZU9uVHlwZURlY2xhcmF0aW9uKChUeXBlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBjaGVja0ZvclJQQ1N0eWxlT25NZXRob2REZWNsYXJhdGlvbigoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvclJQQ0JhcmVPblR5cGVEZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBTVFlMRSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmVxdWFscyhTdHlsZS5SUEMudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzb2FwQmluZGluZywgUEFSQU1FVEVSX1NUWUxFKTsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJTdHlsZSAhPSBudWxsICYmIHBhcmFtZXRlclN0eWxlLmVxdWFscyhQYXJhbWV0ZXJTdHlsZS5CQVJFLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19SUENfTk9fQkFSRV9QQVJBTUVURVJfU1RZTEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIERvY3VtZW50IHN0eWxlIEBTT0FQQmluZGluZyBvbiBtZXRob2RzCi0gICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kRGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHNvYXBCaW5kaW5nMiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXBCaW5kaW5nMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZTIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcyLCBTVFlMRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZTIgPT0gbnVsbCB8fCBzdHlsZTIuZXF1YWxzKFN0eWxlLkRPQ1VNRU5ULnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHNvYXBCaW5kaW5nMi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19OT19NSVhFRF9CSU5ESU5HUyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JFbmNvZGVkVXNlKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBTdHJpbmcgdXNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBVU0UpOwotICAgICAgICBpZiAodXNlICE9IG51bGwgJiYgdXNlLmVxdWFscyhVc2UuRU5DT0RFRC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBTVFlMRSk7Ci0gICAgICAgICAgICBpZiAoc3R5bGUgPT0gbnVsbCB8fCBzdHlsZS5lcXVhbHMoU3R5bGUuRE9DVU1FTlQudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKHNvYXBCaW5kaW5nLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX0RPQ1VNRU5UX0VOQ09ERURfTk9UX1NVUFBPUlRFRCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmcuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfUlBDX0VOQ09ERURfTk9UX1NVUFBPUlRFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JSUENTdHlsZU9uTWV0aG9kRGVjbGFyYXRpb24oTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBzb2FwQmluZGluZyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIFN0cmluZyBzdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzb2FwQmluZGluZywgU1RZTEUpOwotICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5lcXVhbHMoU3R5bGUuUlBDLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19OT19SUENfU1RZTEVfT05fTUVUSE9EUyk7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9VbmlxdWVOYW1lc1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vVW5pcXVlTmFtZXNSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNThkNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9VbmlxdWVOYW1lc1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRkFVTFRfQkVBTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5IRUFERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTE9DQUxfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk5BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUkVTUE9OU0VfU1VGRklYOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlRBUkdFVF9OQU1FU1BBQ0U7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuUmVmZXJlbmNlVHlwZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbjsKLQotcHVibGljIGNsYXNzIFVuaXF1ZU5hbWVzUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJhcmdcXGQrKyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIHdlYlNlcnZpY2VEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aCh3ZWJTZXJ2aWNlRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIGNoZWNrT3BlcmF0aW9uTmFtZXModHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKSk7Ci0gICAgICAgICAgICAgICAgY2hlY2tXcmFwcGVyQW5kRmF1bHRCZWFuTmFtZXModHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKSk7Ci0gICAgICAgICAgICAgICAgY2hlY2tEb2N1bWVudEJhcmVNZXRob2RzKHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCkpOwotICAgICAgICAgICAgICAgIGNoZWNrTWV0aG9kUGFyYW1ldGVycyh0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja09wZXJhdGlvbk5hbWVzKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzKSB7Ci0gICAgICAgIE1hcDxEZWNsYXJhdGlvbiwgUU5hbWU+IG5hbWVNYXAgPSBuZXcgSGFzaE1hcDxEZWNsYXJhdGlvbiwgUU5hbWU+KCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBuYW1lTWFwLnB1dChtZXRob2REZWNsYXJhdGlvbiwgbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShtZXRob2REZWNsYXJhdGlvbi5nZXREZWNsYXJpbmdUeXBlKCkpLAotICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYXRpb25OYW1lKG1ldGhvZERlY2xhcmF0aW9uKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGVjbGFyYXRpb25bXSBrZXlzID0gbmFtZU1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBEZWNsYXJhdGlvbltuYW1lTWFwLnNpemUoKV0pOwotICAgICAgICBRTmFtZVtdIHZhbHVlcyA9IG5hbWVNYXAudmFsdWVzKCkudG9BcnJheShuZXcgUU5hbWVbbmFtZU1hcC5zaXplKCldKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSB2YWx1ZXNbaV07Ci0gICAgICAgICAgICB2YWxpZGF0ZU5hbWUocU5hbWUsIGtleXNbaV0pOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgb3RoZXJRTmFtZSA9IHZhbHVlc1tqXTsKLSAgICAgICAgICAgICAgICBpZiAocU5hbWUuZXF1YWxzKG90aGVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioa2V5c1tpXS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLk9QRVJBVElPTl9OQU1FU19NVVNUX0JFX1VOSVFVRV9FUlJPUiwgcU5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihrZXlzW2pdLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuT1BFUkFUSU9OX05BTUVTX01VU1RfQkVfVU5JUVVFX0VSUk9SLCBvdGhlclFOYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uTWlycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrV3JhcHBlckFuZEZhdWx0QmVhbk5hbWVzKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiByZXF1ZXN0V3JhcHBlckRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihSZXF1ZXN0V3JhcHBlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gcmVzcG9zZVdyYXBwZXJEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oUmVzcG9uc2VXcmFwcGVyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgU2V0PERlY2xhcmF0aW9uPiBtZXRob2RzID0gbmV3IEhhc2hTZXQ8RGVjbGFyYXRpb24+KCk7Ci0gICAgICAgIG1ldGhvZHMuYWRkQWxsKGVudmlyb25tZW50LmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgocmVxdWVzdFdyYXBwZXJEZWNsYXJhdGlvbikpOwotICAgICAgICBtZXRob2RzLmFkZEFsbChlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHJlc3Bvc2VXcmFwcGVyRGVjbGFyYXRpb24pKTsKLQotICAgICAgICBMaXN0PEFubm90YXRpb25WYWx1ZT4gY2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvblZhbHVlPigpOwotICAgICAgICBNYXA8T2JqZWN0LCBRTmFtZT4gcU5hbWVzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBRTmFtZT4oKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogbWV0aG9kcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHJlcXVlc3RXcmFwcGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFJlcXVlc3RXcmFwcGVyLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFdyYXBwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUocmVxdWVzdFdyYXBwZXIsIENMQVNTX05BTUUsIGNsYXNzTmFtZXMpOwotICAgICAgICAgICAgICAgICAgICBhZGRMb2NhbE5hbWUocmVxdWVzdFdyYXBwZXIsIExPQ0FMX05BTUUsIChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb24sIHFOYW1lcyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciByZXNwb25zZVdyYXBwZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgUmVzcG9uc2VXcmFwcGVyLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VXcmFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHJlc3BvbnNlV3JhcHBlciwgQ0xBU1NfTkFNRSwgY2xhc3NOYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZExvY2FsTmFtZShyZXNwb25zZVdyYXBwZXIsIExPQ0FMX05BTUUsIChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb24sIHFOYW1lcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU2V0PFJlZmVyZW5jZVR5cGU+IHRocm93blR5cGVzID0gbmV3IEhhc2hTZXQ8UmVmZXJlbmNlVHlwZT4oKTsKLQotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICB0aHJvd25UeXBlcy5hZGRBbGwobWV0aG9kRGVjbGFyYXRpb24uZ2V0VGhyb3duVHlwZXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFJlZmVyZW5jZVR5cGUgcmVmZXJlbmNlVHlwZSA6IHRocm93blR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlVHlwZSBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgcmVmZXJlbmNlVHlwZTsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYkZhdWx0ID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwgV2ViRmF1bHQuY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh3ZWJGYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHdlYkZhdWx0LCBGQVVMVF9CRUFOLCBjbGFzc05hbWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBjbGFzc05hbWUgPSBjbGFzc05hbWVzLmdldChpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGNsYXNzTmFtZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgb3RoZXJDbGFzc05hbWUgPSBjbGFzc05hbWVzLmdldChqKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lLmdldFZhbHVlKCkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKG90aGVyQ2xhc3NOYW1lLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihjbGFzc05hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XUkFQUEVSX0ZBVUxUX0JFQU5fTkFNRVNfTVVTVF9CRV9VTklRVUUsIGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG90aGVyQ2xhc3NOYW1lLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV1JBUFBFUl9GQVVMVF9CRUFOX05BTUVTX01VU1RfQkVfVU5JUVVFLCBvdGhlckNsYXNzTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbGlkYXRlUU5hbWVzKHFOYW1lcywgSkFYV1NDb3JlTWVzc2FnZXMuTE9DQUxfTkFNRV9BVFRSSUJVVEVTX01VU1RfQkVfVU5JUVVFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVRTmFtZXMoTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcywgU3RyaW5nIGVycm9yTWVzc2FnZSkgewotICAgICAgICBPYmplY3RbXSBrZXlzID0gIHFOYW1lcy5rZXlTZXQoKS50b0FycmF5KG5ldyBPYmplY3RbcU5hbWVzLnNpemUoKV0pOwotICAgICAgICBRTmFtZVtdIHZhbHVlcyA9IHFOYW1lcy52YWx1ZXMoKS50b0FycmF5KG5ldyBRTmFtZVtxTmFtZXMuc2l6ZSgpXSk7Ci0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSB2YWx1ZXNbaV07Ci0gICAgICAgICAgICB2YWxpZGF0ZU5hbWUocU5hbWUsIGtleXNbaV0pOwotICAgICAgICAgICAgZm9yKGludCBqID0gaSArIDE7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBvdGhlclFOYW1lID0gdmFsdWVzW2pdOwotICAgICAgICAgICAgICAgIGlmIChxTmFtZS5lcXVhbHMob3RoZXJRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihnZXRQb3NpdGlvbihrZXlzW2ldKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZChlcnJvck1lc3NhZ2UsIHFOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZ2V0UG9zaXRpb24oa2V5c1tqXSksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoZXJyb3JNZXNzYWdlLCBvdGhlclFOYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFN0cmluZyBhdHRyaWJ1dGVLZXksCi0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25WYWx1ZT4gY2xhc3NOYW1lcykgewotICAgICAgICBBbm5vdGF0aW9uVmFsdWUgY2xhc3NOYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBhdHRyaWJ1dGVLZXkpOwotICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTG9jYWxOYW1lKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciwgU3RyaW5nIGF0dHJpYnV0ZUtleSwKLSAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLCBNYXA8T2JqZWN0LCBRTmFtZT4gcU5hbWVzKSB7Ci0gICAgICAgIEFubm90YXRpb25WYWx1ZSBsb2NhbE5hbWVWYWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgYXR0cmlidXRlS2V5KTsKLSAgICAgICAgaWYgKGxvY2FsTmFtZVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHFOYW1lcy5wdXQobG9jYWxOYW1lVmFsdWUsIG5ldyBRTmFtZShnZXRUYXJnZXROYW1lc3BhY2UoYW5ub3RhdGlvbk1pcnJvciwgbWV0aG9kRGVjbGFyYXRpb24pLAotICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWVWYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0RvY3VtZW50QmFyZU1ldGhvZHMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMpIHsKLSAgICAgICAgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gZG9jQmFyZU1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlY2xhcmF0aW9uPigpOwotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kcykgewotICAgICAgICAgICAgaWYgKGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKG1ldGhvZERlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIGRvY0JhcmVNZXRob2RzLmFkZChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8T2JqZWN0LCBRTmFtZT4gcU5hbWVzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBRTmFtZT4oKTsKLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IGRvY0JhcmVNZXRob2RzKSB7Ci0gICAgICAgICAgICBnZXREb2N1bWVudEJhcmVPcGVyYXRpb25SZXF1ZXN0KG1ldGhvZERlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICAgICAgZ2V0RG9jdW1lbnRCYXJlT3BlcmF0aW9uUmVzcG9uc2UobWV0aG9kRGVjbGFyYXRpb24sIHFOYW1lcyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWxpZGF0ZVFOYW1lcyhxTmFtZXMsIEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX01FVEhPRFNfVU5JUVVFX1hNTF9FTEVNRU5UUyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTb3VyY2VQb3NpdGlvbiBnZXRQb3NpdGlvbihPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQW5ub3RhdGlvblZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBbm5vdGF0aW9uVmFsdWUpIHZhbHVlKS5nZXRQb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChNZXRob2REZWNsYXJhdGlvbikgdmFsdWUpLmdldFBvc2l0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoKFBhcmFtZXRlckRlY2xhcmF0aW9uKSB2YWx1ZSkuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVOYW1lKFFOYW1lIHFOYW1lLCBPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gcU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGlmIChuYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGlmICghWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihnZXRQb3NpdGlvbihvYmplY3QpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSU5WQUxJRF9OQU1FX0FUVFJJQlVURSwgbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTmFtZShBbm5vdGF0aW9uVmFsdWUgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSB2YWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChuYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGlmICghWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcih2YWx1ZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSU5WQUxJRF9OQU1FX0FUVFJJQlVURSwgbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldERvY3VtZW50QmFyZU9wZXJhdGlvblJlcXVlc3QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZSh3ZWJQYXJhbSwgcGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscyhNb2RlLklOLm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblJlcXVlc3Qod2ViUGFyYW0sIG1ldGhvZERlY2xhcmF0aW9uLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQocGFyYW1ldGVyRGVjbGFyYXRpb24sIGdldE9wZXJhdGlvblJlcXVlc3REZWZhdWx0KG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T3BlcmF0aW9uUmVxdWVzdChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLAotICAgICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24sIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIE5BTUUpOwotICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShnZXRUYXJnZXROYW1lc3BhY2UoYW5ub3RhdGlvbk1pcnJvciwgbWV0aG9kRGVjbGFyYXRpb24pLCBuYW1lLmdldFZhbHVlKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcU5hbWVzLnB1dChuYW1lLCBxTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KHBhcmFtZXRlckRlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXF1ZXN0RGVmYXVsdChtZXRob2REZWNsYXJhdGlvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRPcGVyYXRpb25SZXF1ZXN0RGVmYXVsdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShtZXRob2REZWNsYXJhdGlvbi5nZXREZWNsYXJpbmdUeXBlKCkpLCBtZXRob2REZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRTaW1wbGVOYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXREb2N1bWVudEJhcmVPcGVyYXRpb25SZXNwb25zZShNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcykgewotICAgICAgICBpZiAoIXJldHVybnNWb2lkKG1ldGhvZERlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgZ2V0T3BlcmF0aW9uUmVzcG9uc2UoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYlJlc3VsdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1vZGUuT1VULm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpICYmICFpc0hlYWRlcih3ZWJQYXJhbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblJlc3BvbnNlKHdlYlBhcmFtLCBtZXRob2REZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZXREZWZhdWx0V2ViUGFyYW1Nb2RlKHBhcmFtZXRlckRlY2xhcmF0aW9uKS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQocGFyYW1ldGVyRGVjbGFyYXRpb24sIGdldE9wZXJhdGlvblJlc3BvbnNlRGVmYXVsdChtZXRob2REZWNsYXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T3BlcmF0aW9uUmVzcG9uc2UoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIE5BTUUpOwotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQobmFtZSwgbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShhbm5vdGF0aW9uTWlycm9yLCBtZXRob2REZWNsYXJhdGlvbiksIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcU5hbWVzLnB1dChtZXRob2REZWNsYXJhdGlvbiwgZ2V0T3BlcmF0aW9uUmVzcG9uc2VEZWZhdWx0KG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KG1ldGhvZERlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXNwb25zZURlZmF1bHQobWV0aG9kRGVjbGFyYXRpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUU5hbWUgZ2V0T3BlcmF0aW9uUmVzcG9uc2VEZWZhdWx0KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoZ2V0VGFyZ2V0TmFtZXNwYWNlKG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKSksIG1ldGhvZERlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgLmdldFNpbXBsZU5hbWUoKQotICAgICAgICAgICAgICAgICsgUkVTUE9OU0VfU1VGRklYKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yKSB7Ci0gICAgICAgIEJvb2xlYW4gaGVhZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBIRUFERVIpOwotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgcmV0dXJuIGhlYWRlci5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V2ViUGFyYW1Nb2RlKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciwgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG1vZGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgTU9ERSk7Ci0gICAgICAgIGlmIChtb2RlID09IG51bGwgfHwgbW9kZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtb2RlID0gZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbikgewotICAgICAgICBUeXBlTWlycm9yIHR5cGVNaXJyb3IgPSBlbnZpcm9ubWVudC5nZXRUeXBlVXRpbHMoKS5nZXRFcmFzdXJlKHBhcmFtZXRlckRlY2xhcmF0aW9uLmdldFR5cGUoKSk7Ci0gICAgICAgIGlmICh0eXBlTWlycm9yLnRvU3RyaW5nKCkuZXF1YWxzKEhvbGRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTW9kZS5JTk9VVC5uYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1vZGUuSU4ubmFtZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiByZXR1cm5zVm9pZChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhlbnZpcm9ubWVudC5nZXRUeXBlVXRpbHMoKS5nZXRWb2lkVHlwZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNZXRob2RQYXJhbWV0ZXJzKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRGVjbGFyYXRpb24+KCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgIC8vTm90IERvYyBCYXJlCi0gICAgICAgICAgICBpZiAoIWhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKG1ldGhvZERlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkKG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBMaXN0PEFubm90YXRpb25WYWx1ZT4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25WYWx1ZT4oKTsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSAoTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4pIG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKHdlYlBhcmFtLCBOQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZvckdlbmVyYXRlZE5hbWVDbGFzaChuYW1lLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgcGFyYW1ldGVycyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgbmFtZSA9IG5hbWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZU5hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbmFtZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG90aGVyTmFtZSA9IG5hbWVzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUudG9TdHJpbmcoKS5lcXVhbHMob3RoZXJOYW1lLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuUEFSQU1FVEVSX05BTUVfQ0xBU0gsIG5hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG90aGVyTmFtZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5QQVJBTUVURVJfTkFNRV9DTEFTSCwgb3RoZXJOYW1lLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RGb3JHZW5lcmF0ZWROYW1lQ2xhc2goQW5ub3RhdGlvblZhbHVlIHdlYlBhcmFtTmFtZSwgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyLAotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHdlYlBhcmFtTmFtZS50b1N0cmluZygpOwotICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmFtZSk7Ci0gICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgaW50IGFyZ04gPSBJbnRlZ2VyLnBhcnNlSW50KG5hbWUuc3Vic3RyaW5nKDMpKTsKLSAgICAgICAgICAgIGlmIChhcmdOICE9IHBhcmFtZXRlcnMuaW5kZXhPZihwYXJhbWV0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ04gPCBwYXJhbWV0ZXJzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJOID0gcGFyYW1ldGVycy5nZXQoYXJnTik7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW1OID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyTiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAod2ViUGFyYW1OICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSB3ZWJQYXJhbU5hbWVOID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbU4sIE5BTUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtTmFtZU4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IocGFyYW1ldGVyTi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3ZWJQYXJhbU5hbWVOLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViUGFyYW1OYW1lTi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihwYXJhbWV0ZXJOLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0QXR0cmlidXRlVmFsdWUodHlwZURlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlLmNsYXNzLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSh0eXBlRGVjbGFyYXRpb24uZ2V0UGFja2FnZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBnZXRUYXJnZXROYW1lc3BhY2UobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShtZXRob2REZWNsYXJhdGlvbiwgV2ViTWV0aG9kLmNsYXNzLCBPUEVSQVRJT05fTkFNRSk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25OYW1lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBpZiAoc29hcEJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoc29hcEJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICByZXR1cm4gaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQ1ZjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYW5ub3RhdGlvbk1pcnJvcnMgPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFjaGVja0ZvcldlYlNlcnZpY2VBbm5vdGF0aW9uKCgoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKS5nZXREZWNsYXJpbmdUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0ZvcldlYlNlcnZpY2VBbm5vdGF0aW9uKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgV2ViU2VydmljZS5jbGFzcykgIT0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RFeGNsdWRlUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2ZDM0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5FWENMVURFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kRXhjbHVkZVJ1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJNZXRob2QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50LmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZXhjbHVkZUF0dHJpYnV0ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENMVURFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2x1ZGVBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoQm9vbGVhbikgZXhjbHVkZUF0dHJpYnV0ZS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX05PVF9BTExPV0VEX09OX1NFSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFubm90YXRpb25NaXJyb3IuZ2V0RWxlbWVudFZhbHVlcygpLnNpemUoKSA+IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQm9vbGVhbi52YWx1ZU9mKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0VmFsdWUoKS50b1N0cmluZygpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjAxMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQkKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKAotICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPE1vZGlmaWVyPiBtb2RpZmllcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuRklOQUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuU1RBVElDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDFhNzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGNvbnN0cnVjdG9ycyA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0Q29uc3RydWN0b3JzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBoYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDogY29uc3RydWN0b3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFoYXNEZWZhdWx0Q29uc3RydWN0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtaXJyb3IuZ2V0QW5ub3RhdGlvblR5cGUoKS50b1N0cmluZygpLmVxdWFscyhhbm5vdGF0aW9uRGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihkZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUik7IAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNGJkMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRklOQUxJWkU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBmaW5hbGl6ZU1ldGhvZCA9IGdldEZpbmFsaXplTWV0aG9kKGRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIGlmIChmaW5hbGl6ZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZmluYWxpemVNZXRob2QuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9PVkVSUklERV9GSU5BTElaRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1ldGhvZERlY2xhcmF0aW9uIGdldEZpbmFsaXplTWV0aG9kKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pZGVjbGFyYXRpb247Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kRGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyhGSU5BTElaRSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQcm92aWRlclJ1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQcm92aWRlclJ1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NzVhMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVkFMVUU7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsNCi0NCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkludGVyZmFjZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5JbnRlcmZhY2VUeXBlOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7DQotDQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQcm92aWRlclJ1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsNCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7DQotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudA0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgIAlpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICAJCWNoZWNrRm9yRGVmYXVsdENvbnN0cnVjdG9yKChDbGFzc0RlY2xhcmF0aW9uKWRlY2xhcmF0aW9uKTsNCi0gICAgICAgIAkJY2hlY2tGb3JQcm92aWRlckludGVyZmFjZSgoQ2xhc3NEZWNsYXJhdGlvbilkZWNsYXJhdGlvbik7DQotICAgICAgICAJfQ0KLSAgICAgICAgfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tGb3JQcm92aWRlckludGVyZmFjZShDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIENvbGxlY3Rpb248SW50ZXJmYWNlVHlwZT4gaW50ZXJmYWNlcyA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJpbnRlcmZhY2VzKCk7DQotICAgICAgICBib29sZWFuIGltcGxlbWVudHNUeXBlZFByb3ZpZGVyID0gZmFsc2U7DQotICAgICAgICBpZiAoaW50ZXJmYWNlcy5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgZm9yIChJbnRlcmZhY2VUeXBlIGludGVyZmFjZVR5cGUgOiBpbnRlcmZhY2VzKSB7DQotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248VHlwZU1pcnJvcj4gdHlwZVBhcmFtZXRlcnMgPSBpbnRlcmZhY2VUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHR5cGVQYXJhbWV0ZXJzLnNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoVHlwZU1pcnJvciB0eXBlTWlycm9yIDogdHlwZVBhcmFtZXRlcnMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZU1pcnJvciBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2wgPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFNPQVBNZXNzYWdlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU09BUE1lc3NhZ2VSZXF1aXJlbWVudHMoY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzVHlwZWRQcm92aWRlciA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEludGVyZmFjZVR5cGU+IGltcGxlbWVudGVkSW50ZXJmYWNlcyA9IGNsYXNzRGVjbC5nZXRTdXBlcmludGVyZmFjZXMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbnRlcmZhY2VUeXBlIGltcGxlbWVudGVkSW50ZXJmYWNlIDogaW1wbGVtZW50ZWRJbnRlcmZhY2VzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRlcmZhY2VEZWNsID0gaW1wbGVtZW50ZWRJbnRlcmZhY2UuZ2V0RGVjbGFyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VEZWNsICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFNvdXJjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHNUeXBlZFByb3ZpZGVyID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VEZWNsLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoRGF0YVNvdXJjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRGF0YVNvdXJjZVJlcXVpcmVtZW50cyhjbGFzc0RlY2xhcmF0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c1R5cGVkUHJvdmlkZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRlcmZhY2VEZWNsID0gKEludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlTWlycm9yOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFNvdXJjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzVHlwZWRQcm92aWRlciA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKERhdGFTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tEYXRhU291cmNlUmVxdWlyZW1lbnRzKGNsYXNzRGVjbGFyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c1R5cGVkUHJvdmlkZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWltcGxlbWVudHNUeXBlZFByb3ZpZGVyKSB7DQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlUHJvdmlkZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3Iod2ViU2VydmljZVByb3ZpZGVyLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVBST1ZJREVSX0lNUExFTUVOVF9UWVBFRF9QUk9WSURFUl9JTlRFUkZBQ0UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tTT0FQTWVzc2FnZVJlcXVpcmVtZW50cyhDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIGlmICghaXNTT0FQQmluZGluZyhjbGFzc0RlY2xhcmF0aW9uKSkgew0KLSAgICAgICAgICAgIHByaW50RXJyb3IoY2xhc3NEZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUFJPVklERVJfU09BUE1FU1NBR0VfU09BUEJJTkRJTkcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFpc01lc3NhZ2VNb2RlKGNsYXNzRGVjbGFyYXRpb24pKSB7DQotICAgICAgICAgICAgcHJpbnRFcnJvcihjbGFzc0RlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9NRVNTQUdFX01PREUpOw0KLSAgICAgICAgfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tEYXRhU291cmNlUmVxdWlyZW1lbnRzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgaWYgKCFpc0hUVFBCaW5kaW5nKGNsYXNzRGVjbGFyYXRpb24pKSB7DQotICAgICAgICAgICAgcHJpbnRFcnJvcihjbGFzc0RlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX0hUVFBCSU5ESU5HKTsNCi0gICAgICAgIH0NCi0NCi0JICAgIGlmICghaXNNZXNzYWdlTW9kZShjbGFzc0RlY2xhcmF0aW9uKSkgew0KLSAgICAgICAgICAgIHByaW50RXJyb3IoY2xhc3NEZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUFJPVklERVJfREFUQVNPVVJDRV9NRVNTQUdFX01PREUpOw0KLQ0KLSAgICAgICAgfQ0KLSAgICB9DQotCQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTT0FQQmluZGluZyhDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGdldEJpbmRpbmdUeXBlVmFsdWUoY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICBpZiAoYmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykgDQotICAgICAgICAgICAgICAgIHx8IGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpDQotICAgICAgICAgICAgICAgIHx8IGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykNCi0gICAgICAgICAgICAgICAgfHwgYmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKSkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0hUVFBCaW5kaW5nKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgU3RyaW5nIGJpbmRpbmdUeXBlID0gZ2V0QmluZGluZ1R5cGVWYWx1ZShjbGFzc0RlY2xhcmF0aW9uKTsNCi0gICAgICAgIGlmIChiaW5kaW5nVHlwZS5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldEJpbmRpbmdUeXBlVmFsdWUoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGJpbmRpbmdUeXBlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwgQmluZGluZ1R5cGUuY2xhc3MpOw0KLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYmluZGluZ1R5cGUsIFZBTFVFKTsNCi0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNZXNzYWdlTW9kZShDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIHJldHVybiBnZXRTZXJ2aWNlTW9kZShjbGFzc0RlY2xhcmF0aW9uKS5lcXVhbHMoTW9kZS5NRVNTQUdFLm5hbWUoKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF5bG9hZE1vZGUoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICByZXR1cm4gZ2V0U2VydmljZU1vZGUoY2xhc3NEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuUEFZTE9BRC5uYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcnZpY2VNb2RlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBzZXJ2aWNlTW9kZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGNsYXNzRGVjbGFyYXRpb24sIFNlcnZpY2VNb2RlLmNsYXNzKTsNCi0gICAgICAgIGlmIChzZXJ2aWNlTW9kZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNlcnZpY2VNb2RlLCBWQUxVRSk7DQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBNb2RlLlBBWUxPQUQudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JEZWZhdWx0Q29uc3RydWN0b3IoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotCQlib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOw0KLQkJQ29sbGVjdGlvbjxDb25zdHJ1Y3RvckRlY2xhcmF0aW9uPiBjb25zdHJ1Y3RvcnMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldENvbnN0cnVjdG9ycygpOw0KLQkJaWYgKGNvbnN0cnVjdG9ycy5zaXplKCkgPT0gMCkgew0KLQkJCWhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7DQotCQl9IGVsc2Ugew0KLQkJCWZvciAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDogY29uc3RydWN0b3JzKSB7DQotCQkJCWlmIChjb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBVQkxJQykgJiYgDQotCQkJCQkJY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpID09IDApIHsNCi0JCQkJCWhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWlmICghaGFzRGVmYXVsdENvbnN0cnVjdG9yKSB7DQotCQkJQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlUHJvdmlkZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpOw0KLQkJCXByaW50Rml4YWJsZUVycm9yKHdlYlNlcnZpY2VQcm92aWRlci5nZXRQb3NpdGlvbigpLA0KLQkJCSAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVBST1ZJREVSX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SKTsgDQotCQl9ICAgICAgICAgICAgICAgIA0KLQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTE0YWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxNb2RpZmllcj4gbW9kaWZpZXJzID0gZGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5GSU5BTCkgfHwgbW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLkFCU1RSQUNUKSAKLSAgICAgICAgICAgICAgICAgICAgIHx8ICFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIG1pcnJvciA6IGFubm90YXRpb25NaXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbi5nZXROZXN0ZWRUeXBlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdE5lc3RlZFR5cGVzKHR5cGVEZWNsYXJhdGlvbi5nZXROZXN0ZWRUeXBlcygpLCBhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdGVzdE5lc3RlZFR5cGVzKENvbGxlY3Rpb248VHlwZURlY2xhcmF0aW9uPiBuZXN0ZWRUeXBlcywgCi0gICAgICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbikgewotICAgICAgICBmb3IgKFR5cGVEZWNsYXJhdGlvbiBuZXN0ZWREZWNsYXJhdGlvbiA6IG5lc3RlZFR5cGVzKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gbmVzdGVkRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgIGlmIChtaXJyb3IuZ2V0QW5ub3RhdGlvblR5cGUoKS50b1N0cmluZygpLmVxdWFscyhhbm5vdGF0aW9uRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1pcnJvci5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUFVCTElDX0FCU1RSQUNUX0ZJTkFMKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VSZWZzUnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVJlZnNSdWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdmNWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVJlZnNSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5OQU1FOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UWVBFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5WQUxVRTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZnM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7DQotDQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247DQotDQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VSZWZzUnVsZXMgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudA0KLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2VSZWZzLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7DQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlUmVmcyA9IEFubm90YXRpb25VdGlscw0KLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFdlYlNlcnZpY2VSZWZzLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgd2ViU2VydmljZVJlZnNWYWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViU2VydmljZVJlZnMsIFZBTFVFKTsNCi0NCi0gICAgICAgICAgICBpZiAod2ViU2VydmljZVJlZnNWYWx1ZSAhPSBudWxsICYmIHdlYlNlcnZpY2VSZWZzVmFsdWUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIExpc3Q8Pz4pIHsNCi0gICAgICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IHZhbHVlID0gKExpc3Q8QW5ub3RhdGlvblZhbHVlPikgd2ViU2VydmljZVJlZnNWYWx1ZS5nZXRWYWx1ZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb25WYWx1ZSBhbm5vdGF0aW9uVmFsdWUgOiB2YWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25WYWx1ZS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQW5ub3RhdGlvbk1pcnJvcikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVJlZiA9IChBbm5vdGF0aW9uTWlycm9yKSBhbm5vdGF0aW9uVmFsdWUuZ2V0VmFsdWUoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2ViU2VydmljZVJlZk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZVJlZiwgTkFNRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2VSZWZOYW1lID09IG51bGwgfHwgd2ViU2VydmljZVJlZk5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlUmVmLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVJFRlNfTkFNRV9SRVFVSVJFRCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSB3ZWJTZXJ2aWNlUmVmTmFtZVR5cGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZVJlZiwgVFlQRSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2VSZWZOYW1lVHlwZSAhPSBudWxsICYmIHdlYlNlcnZpY2VSZWZOYW1lVHlwZSBpbnN0YW5jZW9mIEFubm90YXRpb25WYWx1ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgdHlwZSA9IChBbm5vdGF0aW9uVmFsdWUpIHdlYlNlcnZpY2VSZWZOYW1lVHlwZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IChDbGFzc0RlY2xhcmF0aW9uKSB0eXBlLmdldFZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHdlYlNlcnZpY2VSZWYuZ2V0UG9zaXRpb24oKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VSRUZTX1RZUEVfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlUmVmLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVJFRlNfVFlQRV9SRVFVSVJFRCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSUFsbG93ZWRBdHRyaWJ1dGVzUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlU0VJQWxsb3dlZEF0dHJpYnV0ZXNSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MjUwZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlU0VJQWxsb3dlZEF0dHJpYnV0ZXNSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVORFBPSU5UX0lOVEVSRkFDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QT1JUX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU0VSVklDRV9OQU1FOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlBbGxvd2VkQXR0cmlidXRlc1J1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIG1pcnJvciA6IGFubm90YXRpb25NaXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBzZXJ2aWNlTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUobWlycm9yLCBTRVJWSUNFX05BTUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3Ioc2VydmljZU5hbWUuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBlbmRwb2ludEludGVyZmFjZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUobWlycm9yLCBFTkRQT0lOVF9JTlRFUkZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTkRQT0lOVElOVEVSRkFDRV9TRUkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgcG9ydE5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgUE9SVF9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHBvcnROYW1lLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUE9SVE5BTUVfU0VJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlU0VJUmVzdHJpY3Rpb25zUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlU0VJUmVzdHJpY3Rpb25zUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU4ODUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVORFBPSU5UX0lOVEVSRkFDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5OQU1FOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTW9kaWZpZXI7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYW5ub3RhdGlvbk1pcnJvcnMgPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZW5kcG9pbnRJbnRlcmZhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRQT0lOVF9JTlRFUkZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobmFtZS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmVzdHJpY3Rpb25zKChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbiwgZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tKU1IxODFBbm5vdGF0aW9ucygoQ2xhc3NEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdHJpY3Rpb25zKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgQW5ub3RhdGlvblZhbHVlIGVuZHBvaW50SW50ZXJmYWNlKSB7Ci0gICAgICAgIFN0cmluZyBzZWkgPSBlbmRwb2ludEludGVyZmFjZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmICgoSkRUVXRpbHMudmFsaWRhdGVKYXZhVHlwZU5hbWUoc2VpKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGVudmlyb25tZW50LmdldFR5cGVEZWNsYXJhdGlvbihzZWkpOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfSU5URVJGQUNFLCBzZWkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKGVuZHBvaW50SW50ZXJmYWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX09VVEVSLCBzZWkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk1pcnJvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9BTk5PVEFURUQsIHNlaSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9QVUJMSUMsIHNlaSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJpbnRlcmZhY2VzKCkuY29udGFpbnModHlwZURlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBzZWlNZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gaW1wbE1ldGhvZHMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZCA6IHNlaU1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbXBsZW1lbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2QgOiBpbXBsTWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5jb21wYXJlTWV0aG9kcyhzZWlNZXRob2QsIGltcGxNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsTWV0aG9kLmdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBVQkxJQykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcHJpbnRGaXhhYmxlRXJyb3IoaW1wbE1ldGhvZC5nZXRQb3NpdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQlKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfUkVEVUNFRF9WSVNJQklMSVRZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsTWV0aG9kLmdldFJldHVyblR5cGUoKS5lcXVhbHMoc2VpTWV0aG9kLmdldFJldHVyblR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcHJpbnRGaXhhYmxlRXJyb3IoaW1wbE1ldGhvZC5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCUpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfUkVUVVJOX1RZUEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWdldEltcGxlbWVudHNNZXNzYWdlKHR5cGVEZWNsYXJhdGlvbiwgc2VpTWV0aG9kKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJIiIsIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfUkVUVVJOX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsZW1lbnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZSh0eXBlRGVjbGFyYXRpb24sIHNlaU1ldGhvZCkpLCAiIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5ELCBzZWkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEltcGxlbWVudHNNZXNzYWdlKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcih0eXBlRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZXNzYWdlLmFwcGVuZChzZWlNZXRob2QuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gc2VpTWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgSXRlcmF0b3I8UGFyYW1ldGVyRGVjbGFyYXRpb24+IGl0ZXIgPSBwYXJhbWV0ZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCh0eXBlTWlycm9yLnN1YnN0cmluZyh0eXBlTWlycm9yLmxhc3RJbmRleE9mKCIuIikgKyAxKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBtZXNzYWdlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSlNSMTgxQW5ub3RhdGlvbnMoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24+IGltcGxNZXRob2RzID0gY2xhc3NEZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBpbXBsTWV0aG9kcykgewotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBtc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICAgICAgaWYgKG1zb2FwQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobXNvYXBCaW5kaW5nLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIG9uZXdheSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBPbmV3YXkuY2xhc3MpOwotICAgICAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3Iob25ld2F5LmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fT05FV0FZKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJNZXRob2QgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh3ZWJNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHdlYk1ldGhvZC5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQk1FVEhPRFMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJSZXN1bHQgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgV2ViUmVzdWx0LmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh3ZWJSZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHdlYlJlc3VsdC5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlJFU1VMVCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAod2ViUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcih3ZWJQYXJhbS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGY3MDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVEFSR0VUX05BTUVTUEFDRTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYWNrYWdlRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudA0KLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7DQotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHRhcmdldE5hbWVzcGFjZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViU2VydmljZSwgVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb247DQotICAgICAgICAgICAgICAgIFBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb24uZ2V0UGFja2FnZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKS5sZW5ndGgoKSA9PSAwICYmIHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgdGFyZ2V0TmFtZXNwYWNlLmdldFZhbHVlKCkudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih0YXJnZXROYW1lc3BhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9ICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTZlZTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVdTRExMb2NhdGlvblJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVORFBPSU5UX0lOVEVSRkFDRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRVhDTFVERTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfTkFNRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUE9SVF9TVUZGSVg7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNFUlZJQ0VfTkFNRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU0VSVklDRV9TVUZGSVg7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNUWUxFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5XU0RMX0xPQ0FUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsNCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5Qb3J0Ow0KLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkJpbmRpbmc7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7DQotDQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247DQotDQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VXU0RMTG9jYXRpb25SdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgew0KLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgd3NkbExvY2F0aW9uVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKHdlYlNlcnZpY2UsIFdTRExfTE9DQVRJT04pOw0KLSAgICAgICAgICAgICAgICBpZiAod3NkbExvY2F0aW9uVmFsdWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAJYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvblZhbHVlLmdldFZhbHVlKCkudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvbiAhPSBudWxsICYmIHdzZGxMb2NhdGlvbi50cmltKCkubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB3c2RsVVJMID0gbmV3IFVSTCh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExVdGlscy5yZWFkV1NETCh3c2RsVVJMKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9ICBnZXRTZXJ2aWNlUU5hbWUod2ViU2VydmljZSwgKENsYXNzRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShkZWZpbml0aW9uLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAgZ2V0UG9ydE5hbWUod2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSBnZXRQb3J0KHNlcnZpY2UsIHBvcnROYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUJpbmRpbmcoYmluZGluZywgY2xhc3NEZWNsYXJhdGlvbiwgd2ViU2VydmljZSwgd3NkbExvY2F0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kTWFwID0gZ2V0V2ViTWV0aG9kcyhjbGFzc0RlY2xhcmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxPcGVyYXRpb24+IG9wZXJhdGlvbnMgPSBiaW5kaW5nLmdldFBvcnRUeXBlKCkuZ2V0T3BlcmF0aW9ucygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uIG9wZXJhdGlvbiA6IG9wZXJhdGlvbnMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBtZXRob2RNYXAuZ2V0KG9wZXJhdGlvbi5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24gPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19PUEVSVEFUSU9OX05BTUUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXROYW1lKCkpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igb25ld2F5ID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLCBPbmV3YXkuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsICYmIG9wZXJhdGlvbi5nZXRPdXRwdXQoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1dTRExfT1BFUkFUSU9OX09VVFBVVF9NRVRIT0RfT05FV0FZLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHttZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCksIG9wZXJhdGlvbi5nZXROYW1lKCl9KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViU2VydmljZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cG9ydE5hbWUsIHdzZGxMb2NhdGlvbn0pKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViU2VydmljZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fU0VSVklDRV9OQU1FLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3NlcnZpY2VRTmFtZS5nZXRMb2NhbFBhcnQoKSwgd3NkbExvY2F0aW9ufSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3c2RsTG9jYXRpb25WYWx1ZS5nZXRQb3NpdGlvbigpLCBtdXJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnROb3RpY2Uod3NkbExvY2F0aW9uVmFsdWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFLCB3c2RsTG9jYXRpb24pKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQmluZGluZyhCaW5kaW5nIGJpbmRpbmcsIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgDQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBTdHJpbmcgd3NkbExvY2F0aW9uKSB7DQotICAgICAgICBTdHJpbmcgc3R5bGUgPSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVC5uYW1lKCk7DQotICAgICAgICANCi0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmdBbm5vdGF0aW9uID0gZ2V0U09BUEJpbmRpbmcoY2xhc3NEZWNsYXJhdGlvbiwgd2ViU2VydmljZSk7DQotICAgICAgICBpZiAoc29hcEJpbmRpbmdBbm5vdGF0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgIFN0cmluZyBzdHlsZVZhbHVlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nQW5ub3RhdGlvbiwgU1RZTEUpOw0KLSAgICAgICAgICAgaWYgKHN0eWxlVmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgIHN0eWxlID0gc3R5bGVWYWx1ZTsNCi0gICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSAgYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsNCi0gICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnRFeHRlbnNpYmxlIDogZXh0ZW5zaWJpbGl0eUVsZW1lbnRzKSB7DQotICAgICAgICAgICAgaWYgKGVsZW1lbnRFeHRlbnNpYmxlIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsNCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGVsZW1lbnRFeHRlbnNpYmxlOw0KLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUuY29tcGFyZVRvSWdub3JlQ2FzZShzb2FwQmluZGluZy5nZXRTdHlsZSgpKSAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHNvYXBCaW5kaW5nQW5ub3RhdGlvbiA9PSBudWxsID8gd2ViU2VydmljZS5nZXRQb3NpdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc29hcEJpbmRpbmdBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCksIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9TT0FQX0JJTkRJTkdfU1RZTEUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7d3NkbExvY2F0aW9uLCBzb2FwQmluZGluZy5nZXRTdHlsZSgpLCBzdHlsZX0pKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZWxlbWVudEV4dGVuc2libGUgaW5zdGFuY2VvZiBTT0FQMTJCaW5kaW5nKSB7DQotICAgICAgICAgICAgICAgIFNPQVAxMkJpbmRpbmcgc29hcDEyQmluZGluZyA9IChTT0FQMTJCaW5kaW5nKSBlbGVtZW50RXh0ZW5zaWJsZTsNCi0gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmNvbXBhcmVUb0lnbm9yZUNhc2Uoc29hcDEyQmluZGluZy5nZXRTdHlsZSgpKSAhPSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHNvYXBCaW5kaW5nQW5ub3RhdGlvbiA9PSBudWxsID8gd2ViU2VydmljZS5nZXRQb3NpdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc29hcEJpbmRpbmdBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1NPQVBfQklORElOR19TVFlMRSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt3c2RsTG9jYXRpb24sIHNvYXAxMkJpbmRpbmcuZ2V0U3R5bGUoKSwgc3R5bGV9KSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgQW5ub3RhdGlvbk1pcnJvciBnZXRTT0FQQmluZGluZyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UpIHsNCi0gICAgICAgIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZSh3ZWJTZXJ2aWNlLCBFTkRQT0lOVF9JTlRFUkZBQ0UpOw0KLSAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gc2VpRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oZW5kcG9pbnRJbnRlcmZhY2UpOw0KLSAgICAgICAgICAgIGlmIChzZWlEZWNsYXJhdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHR5cGVEZWNsYXJhdGlvbiA9IHNlaURlY2xhcmF0aW9uOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLmNsYXNzKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2REZWNsYXJhdGlvbj4gZ2V0V2ViTWV0aG9kcyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UpIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZERlY2xhcmF0aW9uPigpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIEVORFBPSU5UX0lOVEVSRkFDRSk7DQotICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiBzZWlEZWNsYXJhdGlvbiA9IGVudmlyb25tZW50LmdldFR5cGVEZWNsYXJhdGlvbihlbmRwb2ludEludGVyZmFjZSk7DQotICAgICAgICAgICAgaWYgKHNlaURlY2xhcmF0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdHlwZURlY2xhcmF0aW9uID0gc2VpRGVjbGFyYXRpb247DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7DQotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kcykgew0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYk1ldGhvZC5jbGFzcyk7DQotICAgICAgICAgICAgaWYgKHdlYk1ldGhvZCAhPSBudWxsICYmICFpc0V4bHVkZWQod2ViTWV0aG9kKSkgew0KLSAgICAgICAgICAgICAgICBtZXRob2RNYXAucHV0KGdldE9wZXJhdGlvbk5hbWUod2ViTWV0aG9kLCBtZXRob2REZWNsYXJhdGlvbiksIG1ldGhvZERlY2xhcmF0aW9uKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtZXRob2RNYXAucHV0KG1ldGhvZERlY2xhcmF0aW9uLmdldFNpbXBsZU5hbWUoKSwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZXRob2RNYXA7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXhsdWRlZChBbm5vdGF0aW9uTWlycm9yIHdlYk1ldGhvZCkgew0KLSAgICAgICAgQm9vbGVhbiBleGNsdWRlID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZSh3ZWJNZXRob2QsIEVYQ0xVREUpOw0KLSAgICAgICAgaWYgKGV4Y2x1ZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBleGNsdWRlLmJvb2xlYW5WYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoQW5ub3RhdGlvbk1pcnJvciB3ZWJNZXRob2QsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7DQotICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZSh3ZWJNZXRob2QsIE9QRVJBVElPTl9OQU1FKTsNCi0gICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCk7DQotICAgIH0NCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotICAgIHByaXZhdGUgU2VydmljZSBnZXRTZXJ2aWNlKERlZmluaXRpb24gZGVmaW5pdGlvbiwgUU5hbWUgc2VydmljZVFOYW1lKSB7DQotICAgICAgICBNYXAgc2VydmljZXNNYXAgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7DQotICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7DQotICAgICAgICBmb3IgKE1hcC5FbnRyeTxRTmFtZSwgU2VydmljZT4gc2VydmljZUVudHJ5IDogc2VydmljZXNTZXQpIHsNCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlRW50cnlLZXkgPSBzZXJ2aWNlRW50cnkuZ2V0S2V5KCk7DQotICAgICAgICAgICAgaWYgKHNlcnZpY2VFbnRyeUtleS5lcXVhbHMoc2VydmljZVFOYW1lKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZUVudHJ5LmdldFZhbHVlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICBwcml2YXRlIFBvcnQgZ2V0UG9ydChTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyBwb3J0TmFtZSkgew0KLSAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOw0KLSAgICAgICAgU2V0PE1hcC5FbnRyeT4gcG9ydHNTZXQgPSBwb3J0c01hcC5lbnRyeVNldCgpOyAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBQb3J0PiBwb3J0RW50cnkgOiBwb3J0c1NldCkgew0KLSAgICAgICAgICAgIFN0cmluZyBwb3J0RW50cnlLZXkgPSBwb3J0RW50cnkuZ2V0S2V5KCk7DQotICAgICAgICAgICAgaWYgKHBvcnRFbnRyeUtleS5lcXVhbHMocG9ydE5hbWUpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwb3J0RW50cnkuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRTZXJ2aWNlUU5hbWUoQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZSh3ZWJTZXJ2aWNlLCBTRVJWSUNFX05BTUUpOw0KLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwpIHsNCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpICsgU0VSVklDRV9TVUZGSVg7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZSh3ZWJTZXJ2aWNlLCBjbGFzc0RlY2xhcmF0aW9uKSwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFBvcnROYW1lKEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZSwgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZSwgUE9SVF9OQU1FKTsNCi0gICAgICAgIGlmIChwb3J0TmFtZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcG9ydE5hbWUgPSBjbGFzc0RlY2xhcmF0aW9uLmdldFNpbXBsZU5hbWUoKSArIFBPUlRfU1VGRklYOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHBvcnROYW1lOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZSwgVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoDQotICAgICAgICAgICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmdldFBhY2thZ2UoKS5nZXRRdWFsaWZpZWROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhYTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgIGNoZWNrV2ViU2VydmljZVByb3ZpZGVyKG1pcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXZWJTZXJ2aWNlUHJvdmlkZXIoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IpIHsKLSAgICAgICAgaWYgKG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLldFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL3V0aWxzL0pBWFdTVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL3V0aWxzL0pBWFdTVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlMGRlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKQVhXU1V0aWxzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTiA9ICJhY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHID0gImFyZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfQ0hBUkFDVEVSID0gIi4iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfSU5URVJGQUNFID0gImVuZHBvaW50SW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVREUgPSAiZXhjbHVkZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9CRUFOID0gImZhdWx0QmVhbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTElaRSA9ICJmaW5hbGl6ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVIgPSAiaGVhZGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFdTX1NVQlBBQ0tBR0UgPSAiamF4d3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfTkFNRSA9ICJsb2NhbE5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERSA9ICJtb2RlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQgICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OX05BTUUgPSAib3BlcmF0aW9uTmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfU1RZTEUgPSAicGFyYW1ldGVyU3R5bGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9OQU1FID0gInBhcnROYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfTkFNRSA9ICJwb3J0TmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1NVRkZJWCA9ICJQb3J0IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1BPTlNFID0gIlJlc3BvbnNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1BPTlNFX1NVRkZJWCA9ICJSZXNwb25zZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk4gPSAicmV0dXJuIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9ICJzZXJ2aWNlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1NVRkZJWCA9ICJTZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFID0gInN0eWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFID0gInVzZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0xPQ0FUSU9OID0gIndzZGxMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgSkFYV1NVdGlscygpIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRCYXJlKEFubm90YXRpb25NaXJyb3IgbWlycm9yKSB7Ci0gICAgICAgIFN0cmluZyBzdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFNUWUxFKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFVTRSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFBBUkFNRVRFUl9TVFlMRSk7Ci0KLSAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoc3R5bGUsIHVzZSwgcGFyYW1ldGVyU3R5bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50QmFyZShJQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFNUWUxFKTsKLSAgICAgICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFVTRSk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFBBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50QmFyZShzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50QmFyZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBzdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgU1RZTEUpOwotICAgICAgICBTdHJpbmcgdXNlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBVU0UpOwotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFBBUkFNRVRFUl9TVFlMRSk7Ci0KLSAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoc3R5bGUsIHVzZSwgcGFyYW1ldGVyU3R5bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50QmFyZShTdHJpbmcgc3R5bGUsIFN0cmluZyB1c2UsIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSkgewotICAgICAgICByZXR1cm4gKHN0eWxlID09IG51bGwgfHwgc3R5bGUuZXF1YWxzKFN0eWxlLkRPQ1VNRU5ULm5hbWUoKSkpCi0gICAgICAgICAgICAgICAgJiYgKHVzZSA9PSBudWxsIHx8IHVzZS5lcXVhbHMoVXNlLkxJVEVSQUwubmFtZSgpKSkKLSAgICAgICAgICAgICAgICAmJiAocGFyYW1ldGVyU3R5bGUgIT0gbnVsbCAmJiBwYXJhbWV0ZXJTdHlsZS5lcXVhbHMoUGFyYW1ldGVyU3R5bGUuQkFSRS5uYW1lKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudFdyYXBwZWQoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IpIHsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKG1pcnJvciwgU1RZTEUpOwotICAgICAgICBTdHJpbmcgdXNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKG1pcnJvciwgVVNFKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKG1pcnJvciwgUEFSQU1FVEVSX1NUWUxFKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRXcmFwcGVkKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKElBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBzdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgU1RZTEUpOwotICAgICAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgVVNFKTsKLSAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgUEFSQU1FVEVSX1NUWUxFKTsKLSAgICAgICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRXcmFwcGVkKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudFdyYXBwZWQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFNUWUxFKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgVVNFKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBQQVJBTUVURVJfU1RZTEUpOwotCi0gICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRXcmFwcGVkKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudFdyYXBwZWQoU3RyaW5nIHN0eWxlLCBTdHJpbmcgdXNlLCBTdHJpbmcgcGFyYW1ldGVyU3R5bGUpIHsKLSAgICAgICAgcmV0dXJuIChzdHlsZSA9PSBudWxsIHx8IHN0eWxlLmVxdWFscyhTdHlsZS5ET0NVTUVOVC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICYmICh1c2UgPT0gbnVsbCB8fCB1c2UuZXF1YWxzKFVzZS5MSVRFUkFMLm5hbWUoKSkpCi0gICAgICAgICAgICAgICAgJiYgKHBhcmFtZXRlclN0eWxlID09IG51bGwgfHwgcGFyYW1ldGVyU3R5bGUuZXF1YWxzKFBhcmFtZXRlclN0eWxlLldSQVBQRUQubmFtZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGdpdmVuIHtAbGluayBJTWV0aG9kfSB0byBzZWUgaWYgaXQgaXMgYW4gb3ZlcmxvYWRlZCBtZXRob2QuIElmIGl0IGlzIGl0IHdpbGwgcmV0dXJuCi0gICAgICogYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGlzIG1ldGhvZCBpbiBpdCdzIHBhcmVudHMge0BsaW5rIElUeXBlfS4KLSAgICAgKiA8cD4KLSAgICAgKiBFLmcuIEdpdmVuIHRocmVlIG1ldGhvZHM6Ci0gICAgICogPHByZT4KLSAgICAgKiBwdWJsaWMgdm9pZCBteU1ldGhvZCguLi4pOwotICAgICAqIHB1YmxpYyB2b2lkIG15TWV0aG9kKC4uLik7Ci0gICAgICogcHVibGljIHZvaWQgbXlNZXRob2QoLi4uKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiBUaGUgZmlyc3QgbWV0aG9kIHdvdWxkIHJldHVybiBhIGJsYW5rIHN0cmluZywgdGhlIHNlY29uZCB3b3VsZCByZXR1cm4gdGhlIHN0cmluZyAiMSIgYW5kIHRoZSB0aGlyZAotICAgICAqIHdvdWxkIHJldHVybiB0aGUgc3RyaW5nICIyIi4KLSAgICAgKiA8L3A+Ci0gICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kIHRvIHRlc3QKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHZhbHVlCi0gICAgICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gdGhyb3duIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYWNjb3VudEZvck92ZXJsb2FkZWRNZXRob2RzKElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAJSVR5cGUgdHlwZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7Ci0gICAgCWlmICh0eXBlID09IG51bGwpIHsKLSAgICAJCXJldHVybiAiIjsKLSAgICAJfQotICAgICAgICBMaXN0PElNZXRob2Q+IG1ldGhvZHMgPSAgQXJyYXlzLmFzTGlzdCh0eXBlLmdldE1ldGhvZHMoKSk7Ci0gICAgICAgIExpc3Q8SU1ldGhvZD4gc2ltaWxhck1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PElNZXRob2Q+KCk7Ci0gICAgICAgIGZvciAoSU1ldGhvZCBtZXRob2RUb1Rlc3QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBpZiAoIW1ldGhvZC5lcXVhbHMobWV0aG9kVG9UZXN0KSAmJiBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAotICAgICAgICAgICAgICAgICAgICBtZXRob2RUb1Rlc3QuZ2V0RWxlbWVudE5hbWUoKSkgJiYgbWV0aG9kVG9UZXN0LmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgPAotICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0U291cmNlUmFuZ2UoKS5nZXRPZmZzZXQoKSkgewotICAgICAgICAgICAgICAgIHNpbWlsYXJNZXRob2RzLmFkZChtZXRob2RUb1Rlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaW1pbGFyTWV0aG9kcy5zaXplKCkgPiAwID8gSW50ZWdlci50b1N0cmluZyhzaW1pbGFyTWV0aG9kcy5zaXplKCkpIDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQyM2M0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL0pEVFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luOwotCi0vKioKLSAqIEpEVCBVdGlsaXR5IGNsYXNzLgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpEVFV0aWxzIHsKLQotICAgIHByaXZhdGUgSkRUVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgPGNvZGU+SUNsYXNzcGF0aEVudHJ5PC9jb2RlPiB0byBhIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gdG8gYWRkIHRoZSBjbGFzc3BhdGggZW50cnkgdG8KLSAgICAgKiBAcGFyYW0gY2xhc3NwYXRoRW50cnkgdGhlIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT4gdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PElDbGFzc3BhdGhFbnRyeT4gY3VycmVudEVudHJpZXMgPSBBcnJheXMuYXNMaXN0KGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpKTsKLSAgICAgICAgICAgIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBuZXdFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0gICAgICAgICAgICBuZXdFbnRyaWVzLmFkZEFsbChjdXJyZW50RW50cmllcyk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NwYXRoRW50cnkgIT0gbnVsbCAmJiAhbmV3RW50cmllcy5jb250YWlucyhjbGFzc3BhdGhFbnRyeSkpIHsKLSAgICAgICAgICAgICAgICBuZXdFbnRyaWVzLmFkZChjbGFzc3BhdGhFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3RW50cmllcy5zaXplKCldKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT4gZnJvbSBhIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gdG8gcmVtb3ZlIHRoZSBjbGFzc3BhdGggZW50cnkgZnJvbQotICAgICAqIEBwYXJhbSBjbGFzc3BhdGhFbnRyeSB0aGUgPGNvZGU+SUNsYXNzcGF0aEVudHJ5PC9jb2RlPiB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbUNsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGN1cnJlbnRFbnRyaWVzID0gQXJyYXlzLmFzTGlzdChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSk7Ci0gICAgICAgICAgICBMaXN0PElDbGFzc3BhdGhFbnRyeT4gbmV3RW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotICAgICAgICAgICAgbmV3RW50cmllcy5hZGRBbGwoY3VycmVudEVudHJpZXMpOwotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEVudHJ5ICE9IG51bGwgJiYgbmV3RW50cmllcy5jb250YWlucyhjbGFzc3BhdGhFbnRyeSkpIHsKLSAgICAgICAgICAgICAgICBuZXdFbnRyaWVzLnJlbW92ZShjbGFzc3BhdGhFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3RW50cmllcy5zaXplKCldKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEphdmEgcHJvamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwcm9qZWN0IG5hbWUuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBwcm9qZWN0IG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJvamVjdCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICByZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIGphdmEgcHJvamVjdAotICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGRlZmF1bHQgb3V0cHV0IGZvbGRlciBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVByb2plY3RPdXRwdXREaXJlY3RvcnlQYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKS5nZXRMb2NhdGlvbigpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihqYXZhUHJvamVjdC5nZXRQYXRoKCkpLmdldExvY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gb2YgdGhlIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uIGZvciB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0IG5hbWUuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcmV0dXJuICB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZGVmYXVsdCBvdXRwdXQgZm9sZGVyIGZvciB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgc291cmNlIGZvbGRlciB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiB0eXBlLgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSA8Y29kZT5JVHlwZTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBnaXZlbiA8Y29kZT5JVHlwZTwvY29kZT4gc291cmNlIGZvbGRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKElUeXBlIHR5cGUpIHsKLSAgICAgICAgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpOwotICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBwYWNrYWdlRnJhZ21lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgIElSZXNvdXJjZSBzcmNEaXJlY3RvcnlSZXNvdXJjZSA9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgcmV0dXJuIHNyY0RpcmVjdG9yeVJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZnVsbCwgYWJzb2x1dGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlIG9mIHRoZSBmaXJzdCBzb3VyY2UgZm9sZGVyIGZvdW5kIGluIHRoZSBqYXZhIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgdGhlIG5hbWUgb2YgdGhlIGphdmEgcHJvamVjdAotICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIgZm91bmQgaW4gdGhlIGphdmEgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZnVsbCwgYWJzb2x1dGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlIG9mIHRoZSBmaXJzdCBzb3VyY2UgZm9sZGVyIGZvdW5kIGluIHRoZSBnaXZlbiBqYXZhIHByb2plY3QuCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlyc3Qgc291cmNlIGZvbGRlciBmb3VuZCBpbiB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cyA9IGphdmFQcm9qZWN0LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0gICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gcGFja2FnZUZyYWdtZW50Um9vdHNbMF07Ci0gICAgICAgICAgICBJUmVzb3VyY2Ugc3JjRGlyZWN0b3J5UmVzb3VyY2UgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gc3JjRGlyZWN0b3J5UmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUGF0aCgiIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGdpdmVuIDxjb2RlPklUeXBlPC9jb2RlPiBpcyBhbiBpbnRlcmZhY2UgYWxsIG1ldGhvZHMgZGVjbGFyZWQgaW4gdGhhdCBpbnRlcmZhY2UgYXJlIHJldHVybmVkLgotICAgICAqIDxwPgotICAgICAqIEFsdGVybmF0aXZlbHkgaWYgdGhlIGdpdmVuIGdpdmVuIDxjb2RlPklUeXBlPC9jb2RlPiBpcyBhIGNsYXNzLCBvbmx5IG1ldGhvZHMgdGhhdCBhcmUgZXhwbGljaXRseSBtYXJrZWQKLSAgICAgKiBwdWJsaWMgYXJlIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIDxjb2RlPklUeXBlPC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIHB1YmxpYyBtZXRob2RzIGRlY2xhcmVkIGluIHRoaXMgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSU1ldGhvZFtdIGdldFB1YmxpY01ldGhvZHMoSVR5cGUgdHlwZSkgewotICAgICAgICBMaXN0PElNZXRob2Q+IHB1YmxpY01ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PElNZXRob2Q+KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJTWV0aG9kW10gYWxsTWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgaWYgKHR5cGUuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhbGxNZXRob2RzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBhbGxNZXRob2RzW2ldOwotICAgICAgICAgICAgICAgIGlmIChGbGFncy5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkgJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgIW1ldGhvZC5pc01haW5NZXRob2QoKSkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWNNZXRob2RzLmFkZChtZXRob2QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwdWJsaWNNZXRob2RzLnRvQXJyYXkobmV3IElNZXRob2RbcHVibGljTWV0aG9kcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgdGFyZ2V0IG5hbWVzcGFjZSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lIGJ5IHNwbGl0dGluZyB0aGUgZG90ICcuJyBzZXBhcmF0ZWQKLSAgICAgKiBwYWNrYWdlIG5hbWUsIHJldmVyc2luZyB0aGUgb3JkZXIgb2YgdGhlIHBhY2thZ2UgbmFtZSBzZWdtZW50cyBmb2xsb3dlZCBieSBwcmVmaXhpbmcgdGhlIHN0cmluZyB3aXRoCi0gICAgICogJ2h0dHA6Ly8nIGFuZCBhcHBlbmRpbmcgYSBmb3J3YXJkIHNsYXNoICcvJyB0byB0aGUgZW5kLgotICAgICAqIDxwPkUuZy4sIHRoZSBKYXZhIHBhY2thZ2Ug0mNvbS5leGFtcGxlLndz0yB3b3VsZCByZXR1cm4gdGhlIHRhcmdldCBuYW1lc3BhY2Ug0mh0dHA6Ly93cy5leGFtcGxlLmNvbS/TLjwvcD4KLSAgICAgKiA8cD5JZiB0aGUgcGFja2FnZSBuYW1lIGlzIG51bGwgb3IgaXMgb2YgemVybyBsZW5ndGggICJodHRwOi8vZGVmYXVsdF9wYWNrYWdlLyIgaXMgcmV0dXJuZWQuPC9wPgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgcGFja2FnZSBuYW1lCi0gICAgICogQHJldHVybiB0aGUgZGVyaXZlZCB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gImh0dHA6Ly9kZWZhdWx0X3BhY2thZ2UvIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBuYW1lc3BhY2VFbGVtZW50cyA9IEFycmF5cy5hc0xpc3QocGFja2FnZU5hbWUuc3BsaXQoIlxcLiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKG5hbWVzcGFjZUVsZW1lbnRzKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gbmFtZXNwYWNlSXRlcmF0b3IgPSBuYW1lc3BhY2VFbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAobmFtZXNwYWNlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudCA9IG5hbWVzcGFjZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgKz0gZWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSArPSAiLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlICs9ICIvIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoZSBnaXZlbiBqYXZhIHByb2plY3QncyBjbGFzc3BhdGggd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUgZ2l2ZW4gPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPgotICAgICAqIEBwYXJhbSBmdWxseVF1YWxpZmllZENsYXNzTmFtZSB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGUgamF2YSBwcm9qZWN0J3MgY2xhc3NwYXRoIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVR5cGUgZ2V0VHlwZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGphdmFQcm9qZWN0LmZpbmRUeXBlKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHR5cGUgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9sbG93aW5nIHRoZSBjbGFzc3BhdGggb2YgdGhlIGphdmEgcHJvamVjdCB3aXRoCi0gICAgICogdGhlIGdpdmUgcHJvamVjdCBuYW1lIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgdGhlIG5hbWUgb2YgdGhlIGphdmEgcHJvamVjdAotICAgICAqIEBwYXJhbSBmdWxseVF1YWxpZmllZENsYXNzTmFtZSB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGUgamF2YSBwcm9qZWN0J3MgY2xhc3NwYXRoIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVR5cGUgZ2V0VHlwZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0VHlwZShKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSksIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHByb2plY3QgaGFzIHRoZSBqYXZhIG5hdHVyZS4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgZ2l2ZW4gcHJvamVjdAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb2plY3QgaGFzIHRoZSBqYXZhIG5hdHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtZXRob2QgaXNuJ3QgYSBtYWluIG1ldGhvZCBvciBjb25zdHJ1Y3RvciBhbmQgaWYgaXQgaGFzIHRoZSBwdWJsaWMgbW9kaWZpZXIuCi0gICAgICogQHBhcmFtIG1ldGhvZCB0aGUgZ2l2ZW4gbWV0aG9kCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGlzIHB1YmxpYwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmxpY01ldGhvZChJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIEZsYWdzLmlzUHVibGljKG1ldGhvZC5nZXRGbGFncygpKSAmJiAhbWV0aG9kLmlzQ29uc3RydWN0b3IoKSAmJiAhbWV0aG9kLmlzTWFpbk1ldGhvZCgpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gSmF2YSB0eXBlIG5hbWUsIGVpdGhlciBzaW1wbGUgb3IgcXVhbGlmaWVkLCB1c2luZyB0aGUgd29ya3NwYWNlIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSB0eXBlCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIElTdGF0dXMuT0sgaWYgdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBKYXZhIHR5cGUgbmFtZSwgYSBzdGF0dXMgd2l0aAotICAgICAqIGNvZGUgSVN0YXR1cy5XQVJOSU5HIGluZGljYXRpbmcgd2h5IHRoZSBnaXZlbiBuYW1lIGlzIGRpc2NvdXJhZ2VkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSmF2YVR5cGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFN0cmluZyBzb3VyY2VMZXZlbCA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UpOwotICAgICAgICBTdHJpbmcgY29tcGxpYW5jZUxldmVsID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpOwotICAgICAgICByZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKG5hbWUsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gSmF2YSB0eXBlIG5hbWUsIGVpdGhlciBzaW1wbGUgb3IgcXVhbGlmaWVkLCB1c2luZyB0aGUgZ2l2ZW4gcHJvamVjdHMgc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscy4KLSAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgdGhlIG5hbWUgb2YgdGhlIGphdmEgcHJvamVjdAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgdHlwZQotICAgICAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSBJU3RhdHVzLk9LIGlmIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgSmF2YSB0eXBlIG5hbWUsIGEgc3RhdHVzIHdpdGgKLSAgICAgKiBjb2RlIElTdGF0dXMuV0FSTklORyBpbmRpY2F0aW5nIHdoeSB0aGUgZ2l2ZW4gbmFtZSBpcyBkaXNjb3VyYWdlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUphdmFUeXBlTmFtZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUxldmVsID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgdHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSBqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUobmFtZSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSB1c2luZyB0aGUgZ2l2ZW4gcHJvamVjdHMgc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscy4KLSAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgdGhlIG5hbWUgb2YgdGhlIGphdmEgcHJvamVjdAotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB0aGUgbmFtZSBvZiBhIHBhY2thZ2UKLSAgICAgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgSVN0YXR1cy5PSyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIHBhY2thZ2UgbmFtZSwgb3RoZXJ3aXNlIGEgc3RhdHVzCi0gICAgICogb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlUGFja2FnZU5hbWUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBTdHJpbmcgc291cmNlTGV2ZWwgPSBqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFLCB0cnVlKTsKLSAgICAgICAgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCA9IGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgaWRlbnRpZmllciB3aXRoIHRoZSB3b3Jrc3BhY2Ugc291cmNlIGFuZCBjb21wbGlhbmNlIGxldmVscy4KLSAgICAgKiBAcGFyYW0gaWQgdGhlIEphdmEgaWRlbnRpZmllcgotICAgICAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSBJU3RhdHVzLk9LIGlmIHRoZSBnaXZlbiBpZGVudGlmaWVyIGlzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLCBvdGhlcndpc2UKLSAgICAgKiBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIGlkZW50aWZpZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVJZGVudGlmaWVyKFN0cmluZyBpZCkgewotICAgICAgICBTdHJpbmcgc291cmNlTGV2ZWwgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFKTsKLSAgICAgICAgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKTsKLSAgICAgICAgcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUlkZW50aWZpZXIoaWQsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMTU0ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvV1NETFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLlVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogV1NETCBVdGlsaXR5IGNsYXNzLgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdTRExVdGlscyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRklMRV9OQU1FX1BBVFRFUk4gPSAiW2EtekEtWjAtOV9cXC1dKy53c2RsIjsvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfUVVFUlkgPSAiP3dzZGwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBXU0RMX0ZPTERFUl9QQVRIID0gbmV3IFBhdGgoIndzZGwvIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVCA9IDMwMDAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFX0VYVEVOU0lPTiA9ICIud3NkbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgV1NETFV0aWxzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSA8Y29kZT5qYXZheC53c2RsLkRlZmluaXRpb248L2NvZGU+IGJ5IHJlYWRpbmcgdGhlIFdTREwgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIFVSTCBvciBudWxsIGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0gICAgICogb3IgaWYgdGhlIGNvbm5lY3Rpb24gdGltZXMgb3V0LgotICAgICAqIEBwYXJhbSB3c2RsVVJMIHRoZSB1cmwgb2YgdGhlIHdzZGwgZG9jdW1lbnQgdG8gcmVhZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZpbml0aW9uIGRlc2NyaWJlZCBpbiB0aGUgd3NkbCBkb2N1bWVudCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBVUkwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXhjZXB0aW9uIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gcmVhZFdTREwoVVJMIHdzZGxVUkwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgCVVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IHdzZGxVUkwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAJdXJsQ29ubmVjdGlvbi5zZXRDb25uZWN0VGltZW91dChUSU1FT1VUKTsKLSAgICAJdXJsQ29ubmVjdGlvbi5zZXRSZWFkVGltZW91dChUSU1FT1VUKTsKLSAgICAJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSB1cmxDb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBXU0RMRmFjdG9yeSB3c2RsRmFjdG9yeSA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBXU0RMUmVhZGVyIHdzZGxSZWFkZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsUmVhZGVyLnJlYWRXU0RMKHdzZGxVUkwuZ2V0UGF0aCgpLCBpbnB1dFNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiB3c2RsZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyh3c2RsZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiA8Y29kZT5qYXZheC53c2RsLkRlZmluaXRpb248L2NvZGU+IHRvIHRoZSB3c2RsIGRvY3VtZW50IGF0IHRoZSBnaXZlbiBVUkwuCi0gICAgICogQHBhcmFtIHdzZGxVUkwgdGhlIHVybCBvZiB0aGUgd3NkbCBkb2N1bWVudCB0byB3cml0ZSB0by4KLSAgICAgKiBAcGFyYW0gZGVmaW5pdGlvbiB0aGUgV1NETCBkZWZpbml0aW9uIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBvY2N1cnMuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgcmVmcmVzaGluZyB0aGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlIGlmIGl0IGV4aXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVXU0RMKFVSTCB3c2RsVVJMLCBEZWZpbml0aW9uIGRlZmluaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgCVVSSSB3c2RsVVJJID0gbnVsbDsKLSAgICAgICAgT3V0cHV0U3RyZWFtIHdzZGxPdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAJd3NkbFVSSSA9IHdzZGxVUkwudG9VUkkoKTsKLSAgICAgICAgICAgIEZpbGUgd3NkbEZpbGUgPSBuZXcgRmlsZSh3c2RsVVJJKTsKLSAgICAgICAgICAgIHdzZGxPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh3c2RsRmlsZSk7Ci0gICAgICAgICAgICBXU0RMRmFjdG9yeSB3c2RsRmFjdG9yeSA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBXU0RMV3JpdGVyIHdzZGxXcml0ZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMV3JpdGVyKCk7Ci0gICAgICAgICAgICB3c2RsV3JpdGVyLndyaXRlV1NETChkZWZpbml0aW9uLCB3c2RsT3V0cHV0U3RyZWFtKTsKLSAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiB3c2RsZSkgewotICAgICAgICAJSkFYV1NDb3JlUGx1Z2luLmxvZyh3c2RsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB1cmlzZSkgewotICAgICAgICAJSkFYV1NDb3JlUGx1Z2luLmxvZyh1cmlzZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAod3NkbE91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3NkbE91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0JCQkJCQkuZ2V0RmlsZUZvckxvY2F0aW9uKFVSSVV0aWwudG9QYXRoKHdzZGxVUkkpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZmlsZSBuYW1lIGNvbnRhaW5zIEFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCB1bmRlcnNjb3JlICdfJywKLSAgICAgKiBkYXNoZXMgJy0nIGFuZCBlbmRzIHdpdGggdGhlICcud3NkbCcgZXh0ZW5zaW9uLiBPdGhlcndpc2UgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogQHBhcmFtIHdzZGxGaWxlTmFtZSB0aGUgd3NkbCBmaWxlIG5hbWUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHZhbGlkLCBjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXU0RMRmlsZU5hbWUoU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICByZXR1cm4gd3NkbEZpbGVOYW1lICE9IG51bGwgJiYgd3NkbEZpbGVOYW1lLm1hdGNoZXMoV1NETF9GSUxFX05BTUVfUEFUVEVSTik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIG9mIHRoZSBnaXZlbiBwcm9qZWN0LiBUaGUgcmV0dXJuZWQgcmVzb3VyY2UgbWF5IG5vdCBleGlzdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgbmFtZSBvZiB0aGUgd2ViIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSB3ZWIgY29udGVudCBmb2xkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElGb2xkZXIgZ2V0V2ViQ29udGVudEZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcigKLQkJCQlXU0RMVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCkpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFdTREwgZm9sZGVyIG9mIHRoZSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuIFRoZSBXU0RMIGZvbGRlciBwYXRoIGlzIHRoZSBwcm9qZWN0cyB3ZWIgY29udGVudCBmb2xkZXIKLSAgICAgKiBwYXRoIGFwcGVuZGVkIHdpdGggdGhlICdXU0RMJyBkaXJlY3RvcnkuIFRoZSByZXR1cm5lZCByZXNvdXJjZSBtYXkgbm90IGV4aXN0LgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgd2ViIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSB3c2RsIGZvbGRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUZvbGRlciBnZXRXU0RMRm9sZGVyKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gV1NETFV0aWxzLmdldFdTRExGb2xkZXIoV1NETFV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBXU0RMIGZvbGRlciBvZiB0aGUgZ2l2ZW4gcHJvamVjdC4gVGhlIFdTREwgZm9sZGVyIHBhdGggaXMgdGhlIHByb2plY3RzIHdlYiBjb250ZW50IGZvbGRlcgotICAgICAqIHBhdGggYXBwZW5kZWQgd2l0aCB0aGUgJ1dTREwnIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkIHJlc291cmNlIG1heSBub3QgZXhpc3QuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSB3ZWIgcHJvamVjdAotICAgICAqIEByZXR1cm4gdGhlIHdzZGwgZm9sZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRm9sZGVyIGdldFdTRExGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJUGF0aCB3c2RsRm9sZGVyUGF0aCA9IFdTRExVdGlscy5nZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KS5hcHBlbmQoV1NETFV0aWxzLldTRExfRk9MREVSX1BBVEgpOwotICAgICAgICBJRm9sZGVyIHdzZGxGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcih3c2RsRm9sZGVyUGF0aCk7Ci0gICAgICAgIGlmICghd3NkbEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3c2RsRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbEZvbGRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCA8Y29kZT5TT0FQQWRkcmVzczwvY29kZT4gb3IgPGNvZGU+U09BUDEyQWRkcmVzczwvY29kZT4gZm91bmQgaW4gdGhlIGdpdmVuCi0gICAgICogPGNvZGU+RGVmaW5pdGlvbjwvY29kZT4gb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uIHRoZSBnaXZlbiBkZWZpbml0aW9uLgotICAgICAqIEByZXR1cm4gcmV0dXJuIG9uZSBvZjoKLSAgICAgKiA8bGk+U09BUEFkZHJlc3M8bGk+U09BUDEyQWRkcmVzczxsaT5udWxsIGlmIGl0IGNhbiBub3QgZmluZCBhIHNvYXAgYWRkcmVzcwotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZ2V0RW5kcG9pbnRBZGRyZXNzKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXAgc2VydmljZXNNYXAgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeSBzZXJ2aWNlRW50cnkgOiBzZXJ2aWNlc1NldCkgewotICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBNYXAgcG9ydHNNYXAgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgICAgICAgICAgU2V0PE1hcC5FbnRyeT4gcG9ydHNTZXQgPSBwb3J0c01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHBvcnRFbnRyeSA6IHBvcnRzU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBwb3J0RW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBleHRlbnNpYmlsaXR5RWxlbWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcyB8fCBvYmplY3QgaW5zdGFuY2VvZiBTT0FQMTJBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFeHRlbnNpYmlsaXR5RWxlbWVudCkgb2JqZWN0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBVUkkgZnJvbSB0aGUgZmlyc3QgPGNvZGU+U09BUEFkZHJlc3M8L2NvZGU+IG9yIDxjb2RlPlNPQVAxMkFkZHJlc3M8L2NvZGU+IGZvdW5kCi0gICAgICogaW4gdGhlIGdpdmVuIDxjb2RlPkRlZmluaXRpb248L2NvZGU+IG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4gVGhlIHJldHVybmVkIGxvY2F0aW9uIFVSSSBpcyBhcHBlbmRlZCB3aXRoCi0gICAgICogdGhlICc/d3NkbCcgcXVlcnkgaWYgdGhlIHF1ZXJ5IHdhcyBub3QgcHJlc2VudCBpbiB0aGUgPGNvZGU+U09BUEFkZHJlc3M8L2NvZGU+IG9yIDxjb2RlPlNPQVAxMkFkZHJlc3M8L2NvZGU+IGxvY2F0aW9uIFVSSS4KLSAgICAgKiBAcGFyYW0gZGVmaW5pdGlvbiB0aGUgZ2l2ZW4gZGVmaW50aW9uLgotICAgICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIFVSSSBvciB0aGUgZmlyc3QgPGNvZGU+U09BUEFkZHJlc3M8L2NvZGU+IG9yIDxjb2RlPlNPQVAxMkFkZHJlc3M8L2NvZGU+IGZvdW5kIGluIHRoZSBnaXZlbiBkZWZpbml0aW9uLgotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB0ZXN0aW5nIHRoZSBsb2NhdGlvbiBVUkkgZm9yIGEgcXVlcnkgcGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBXU0RMVXRpbHMuZ2V0RW5kcG9pbnRBZGRyZXNzKGRlZmluaXRpb24pOwotCQlpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgIT0gbnVsbCkgewotCSAgICAgICAgU3RyaW5nIGxvY2F0aW9uVVJJID0gZ2V0TG9jYXRpb25VUkkoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotCSAgICAgICAgaWYgKGxvY2F0aW9uVVJJLmxlbmd0aCgpID4gMCkgewotCSAgICAgICAgICAgIFVSTCBlbmRwb2ludFVSTCA9IG5ldyBVUkwobG9jYXRpb25VUkkpOwotCSAgICAgICAgICAgIGlmIChlbmRwb2ludFVSTC5nZXRRdWVyeSgpID09IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgbG9jYXRpb25VUkkgKz0gV1NETF9RVUVSWTsKLQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uVVJJOwotCSAgICAgICAgfQotCQl9Ci0JICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMb2NhdGlvblVSSShFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkgewotCSAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgewotICAgICAgICAgICAgcmV0dXJuICgoU09BUEFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVAxMkFkZHJlc3MpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFNPQVAxMkFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICB9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBkb3Qgc2VwYXJhdGVkIHBhY2thZ2UgbmFtZSBmcm9tIGEgZ2l2ZW4gbmFtZXNwYWNlLgotICAgICAqIDxwPkUuZy4sIHRoZSBuYW1lc3BhY2Ug0mh0dHA6Ly93cy5leGFtcGxlLmNvbS/TIHdvdWxkIHJldHVybiB0aGUgSmF2YSBwYWNrYWdlIG5hbWUg0mNvbS5leGFtcGxlLndz0y48L3A+Ci0gICAgICogPHA+Ti5CLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwcmVzZXJ2ZSAnd3d3JyBpbiB0aGUgcmV0dXJuZWQgcGFja2FnZSBuYW1lIGlmIGl0IGV4aXN0cyBpbiB0aGUgZ2l2ZW4gbmFtZXNwYWNlLjwvcD4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIEByZXR1cm4gYSBwYWNrYWdlIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwYWNrYWdlTmFtZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIFVSTCBuYW1lc3BhY2VVUkwgPSBuZXcgVVJMKG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB3d3cgaWYgdGhlcmUKLSAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHkgPSBuYW1lc3BhY2VVUkwuZ2V0QXV0aG9yaXR5KCk7Ci0gICAgICAgICAgICBpZiAoYXV0aG9yaXR5LmluZGV4T2YoInd3dyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBhdXRob3JpdHkgPSBhdXRob3JpdHkuc3Vic3RyaW5nKGF1dGhvcml0eS5pbmRleE9mKCIuIikgKyAxLCBhdXRob3JpdHkubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhdXRob3JpdHlFbGVtZW50cyA9IEFycmF5cy5hc0xpc3QoYXV0aG9yaXR5LnNwbGl0KCJcXC4iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoYXV0aG9yaXR5RWxlbWVudHMpOwotICAgICAgICAgICAgcGFja2FnZU5hbWVFbGVtZW50cy5hZGRBbGwoYXV0aG9yaXR5RWxlbWVudHMpOwotCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG5hbWVzcGFjZVVSTC5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcGF0aEVsZW1lbnRzID0gQXJyYXlzLmFzTGlzdChwYXRoLnNwbGl0KCJbL1xcXFxdIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwYWNrYWdlTmFtZUVsZW1lbnRzLmFkZEFsbChwYXRoRWxlbWVudHMpOwotCi0gICAgICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IHBhY2thZ2VJdGVyYXRvciA9IHBhY2thZ2VOYW1lRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChwYWNrYWdlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnQgPSBwYWNrYWdlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKz0gZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICs9ICIuIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2cobXVybGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGIxOWFkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTA0ODRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gSnVsIDIwIDE1OjI1OjMxIEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDJmZWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjANCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbjtzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC5wbHVnaW4uRG9tSW50ZWdyYXRpb25QbHVnaW4NCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywNCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS51aS5pZGUsDQotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciwNCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sDQotIG9yZy5lY2xpcHNlLmpkdC51aSwNCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwNCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aSwNCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscw0KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5DQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5hY3Rpb25zLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnZhbGlkYXRpb24NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDEwYWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmNGU3OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdjYjg5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTGFuZ3VhZ2UgRmlsZSBmb3IgdGhpcyBQbHVnaW4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBHZW5lcmljIExhYmVsIGFuZCBEZXNjcmlwdGlvbg0KLUJ1bmRsZS1OYW1lLjA9RE9NIEludGVncmF0aW9uIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KLQ0KLURvbVZhbGlkYXRvcl9OYW1lID0gV2ViIFNlcnZpY2VzIFZhbGlkYXRpb24NCi1Eb21WYWxpZGF0aW9uX01hcmtlck5hbWUgPSBXZWIgU2VydmljZXMgUHJvYmxlbSBNYXJrZXINCi1uYXZpZ2F0b3JDb250ZW50Lm5hbWUuMCA9IEpBWC1XUyBXZWIgU2VydmljZXMgRWxlbWVudHMNCi1kZWNvcmF0b3IubGFiZWwuMCA9IFdlYiBTZXJ2aWNlIERlY29yYXRvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwMzc5NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQotPCEtLQ0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAtLT4NCi0NCi08cGx1Z2luPg0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPg0KLQkJPGZhY3RvcnkgDQotCQkJdXJpID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS5lY29yZSIgDQotCQkJY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiIA0KLQkJCXN1cHBvcnRlZFR5cGVzID0gDQotCQkJCSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcg0KLQkJCQlvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXINCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyDQotCQkJCW9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcg0KLQkJCQlvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIiAvPg0KLQk8L2V4dGVuc2lvbj4NCi0JDQotICA8IS0tIHt7eyBEZWZpbmVzIGludGVncmF0aW9uIGZvciBET00gb2JqZWN0cyB0byBuYXZpZ2F0aW9uIHRyZWUgLS0+DQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4gDQotCQk8bmF2aWdhdG9yQ29udGVudA0KLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUudWkuc2FwV1MiDQotCQkJY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciINCi0JCQlsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIiDQotCQkJYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIg0KLQkJCW5hbWU9IiVuYXZpZ2F0b3JDb250ZW50Lm5hbWUuMCINCi0JCQlwcmlvcml0eT0iaGlnaGVzdCI+DQotCQkJPHRyaWdnZXJQb2ludHM+DQotCQkJCTxvcj4NCi0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIgLz4NCi0JCQkJPC9vcj4NCi0JCQk8L3RyaWdnZXJQb2ludHM+DQotCQkJPHBvc3NpYmxlQ2hpbGRyZW4+DQotCQkJCTxvcj4NCi0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlIi8+DQotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+DQotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kIi8+DQotCQkJCTwvb3I+DQotCQkJPC9wb3NzaWJsZUNoaWxkcmVuPg0KLQkJCTxhY3Rpb25Qcm92aWRlcg0KLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucy5XU0FjdGlvblByb3ZpZGVyIg0KLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucy5XU0FjdGlvblByb3ZpZGVyIj4NCi0JCQkJPGVuYWJsZW1lbnQ+DQotCQkJCQk8b3I+DQotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIi8+DQotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UiLz4NCi0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+DQotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCIvPg0KLQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSIvPg0KLQkJCQkJPC9vcj4NCi0JCQkJPC9lbmFibGVtZW50Pg0KLQkJCTwvYWN0aW9uUHJvdmlkZXI+DQotCQk8L25hdmlnYXRvckNvbnRlbnQ+DQotCTwvZXh0ZW5zaW9uPg0KLQkNCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+DQotCQk8ZGVjb3JhdG9yDQotCQkJYWRhcHRhYmxlPSJ0cnVlIg0KLSAgICAgICAgICAgIGxvY2F0aW9uPSJCT1RUT01fUklHSFQiDQotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9ImZhbHNlIg0KLSAgICAgICAgICAgIGxhYmVsPSIlZGVjb3JhdG9yLmxhYmVsLjAiDQotICAgICAgICAgICAgc3RhdGU9InRydWUiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLldlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuV2ViU2VydmljZURlY29yYXRvciI+DQotCQkJPGVuYWJsZW1lbnQ+DQotCQkJCTxvcj4NCi0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ii8+DQotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVdlYlNlcnZpY2VDaGlsZExpc3QiLz4NCi0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCIvPg0KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCIvPg0KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtIi8+DQotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPg0KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIvPg0KLQkJCQk8L29yPg0KLQkJCTwvZW5hYmxlbWVudD4NCi0JCTwvZGVjb3JhdG9yPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgPCEtLSB9fX0gLS0+DQotICA8IS0tIHt7eyBEZWZpbmVzIGludGVncmF0aW9uIGZvciBET00gb2JqZWN0cyB0byBwcm9wZXJ0aWVzIHZpZXcgLS0+DQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4NCi0JCTxmYWN0b3J5DQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSINCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPg0KLQkJCTxhZGFwdGVyDQotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPg0KLQkJCTwvYWRhcHRlcj4NCi0JCTwvZmFjdG9yeT4NCi0JCTxmYWN0b3J5DQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIg0KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSI+DQotCQkJPGFkYXB0ZXINCi0JCQkJdHlwZT0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlciI+DQotCQkJPC9hZGFwdGVyPg0KLQkJPC9mYWN0b3J5Pg0KLQkJPGZhY3RvcnkNCi0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCINCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPg0KLQkJCTxhZGFwdGVyDQotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPg0KLQkJCTwvYWRhcHRlcj4NCi0JCTwvZmFjdG9yeT4NCi0JCTxmYWN0b3J5DQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kIg0KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSI+DQotCQkJPGFkYXB0ZXINCi0JCQkJdHlwZT0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlciI+DQotCQkJPC9hZGFwdGVyPg0KLQkJPC9mYWN0b3J5Pg0KLQkJPGZhY3RvcnkNCi0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSINCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPg0KLQkJCTxhZGFwdGVyDQotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPg0KLQkJCTwvYWRhcHRlcj4NCi0JCTwvZmFjdG9yeT4JCQ0KLQkJPGZhY3RvcnkNCi0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklET01Qcm9wZXJ0eVZhbHVlIg0KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01JdGVtVmFsdWVQcm9wZXJ0eVNvdXJjZUZhY3RvcnkiPg0KLQkJCTxhZGFwdGVyDQotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlIj4NCi0JCQk8L2FkYXB0ZXI+DQotCQk8L2ZhY3Rvcnk+CQkNCi0gICA8L2V4dGVuc2lvbj4NCi08IS0tIH19fSAtLT4NCi08IS0tIHt7eyBEZWZpbmVzIGludGVncmF0aW9uIGZvciBXU1QgdmFsaWRhdGlvbiBmcmFtZXdvcmsgLS0+DQotICAgPGV4dGVuc2lvbg0KLQkgICAgICAgICBpZD0id3NWYWxpZGF0b3IiDQotCSAgICAgICAgIG5hbWU9IiVEb21WYWxpZGF0b3JfTmFtZSINCi0JICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+DQotCSAgICAgIAk8dmFsaWRhdG9yPg0KLQkJICAgICAgICAgPGZpbHRlciBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiIG5hbWVGaWx0ZXI9IiouamF2YSIgLz4NCi0JCSAgICAgICAgIDxtYXJrZXJJZCBtYXJrZXJJZFZhbHVlPSJXc1ZhbGlkYXRvck1hcmtlciIgLz4NCi0JCSAgICAgICAgIDxoZWxwZXINCi0JCSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkhlbHBlciI+DQotCQkgICAgICAgICA8L2hlbHBlcj4NCi0JCSAgICAgICAgIDxydW4NCi0JCSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbk1hbmFnZXIiPg0KLQkJICAgICAgICAgPC9ydW4+DQotCSAgICAgIAk8L3ZhbGlkYXRvcj4JICAgICAgCQ0KLQk8L2V4dGVuc2lvbj4NCi0JPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJXc1ZhbGlkYXRvck1hcmtlciINCi0gICAgICAgICBuYW1lPSIlRG9tVmFsaWRhdGlvbl9NYXJrZXJOYW1lIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4NCi0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvYmxlbW1hcmtlciIvPg0KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIi8+ICAgICAgDQotICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiIC8+DQotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0NDIxYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOw0KLQ0KLXB1YmxpYyBjbGFzcyBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC5wbHVnaW4uRG9tSW50ZWdyYXRpb25NZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0pheFdzV2ViU2VydmljZXNMYWJlbDsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdDYW5jZWxlZExhYmVsOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfTG9hZGluZ0R1bW15TGFiZWw7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9TZWlMYWJlbDsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1dlYlNlcnZpY2VzTGFiZWw7DQotDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5XU1Jlc291cmNlQWN0aW9uX05hbWU7DQotDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5XZWJTZXJ2aWNlc0FyZWFBY3Rpb247DQotDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5FSkJBcmVhQWN0aW9uOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RGaWxlc1RvQ2hlY2tvdXREbGdUaXRsZTsNCi0JDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEZpbGVzVG9DaGVja291dERsZ1RibFRpdGxlOwkNCi0NCi0JLyoqIG1lc3NhZ2UgY29uc3RhbnQgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0RmlsZXNUb0NoZWNrb3V0X0NhbmNlbGVkTWVzc2FnZTsJDQotCQkNCi0JDQotCXN0YXRpYw0KLQl7DQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLmNsYXNzKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwN2Y5NTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLURPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9KYXhXc1dlYlNlcnZpY2VzTGFiZWwJCT0gSkFYLVdTIFdlYiBTZXJ2aWNlcw0KLURPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9Mb2FkaW5nQ2FuY2VsZWRMYWJlbAkJCT0gTG9hZGluZyBDYW5jZWxlZA0KLURPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9Mb2FkaW5nRHVtbXlMYWJlbAkJCT0gTG9hZGluZy4uLg0KLURPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9TZWlMYWJlbAkJCQkJCT0gU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1dlYlNlcnZpY2VzTGFiZWwJCQkJPSBXZWIgU2VydmljZXMNCi0NCi1PcGVuV1NSZXNvdXJjZUFjdGlvbl9OYW1lCQkJCQkJCQkJPSBPcGVuDQotDQotTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uX1Nob3dJbldlYlNlcnZpY2VzQXJlYUFjdGlvbgk9IExvY2F0ZSBpbiBXZWIgU2VydmljZXMgTm9kZQ0KLU5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5FSkJBcmVhQWN0aW9uCQkJPSBMb2NhdGUgaW4gRGVwbG95bWVudCBEZXNjcmlwdG9yIE5vZGUNCi0NCi0NCi1TZWxlY3RGaWxlc1RvQ2hlY2tvdXREbGdUaXRsZQkJCQkJCQkJPSBDb25maXJtIHJlc291cmNlIGNoZWNrb3V0DQotU2VsZWN0RmlsZXNUb0NoZWNrb3V0RGxnVGJsVGl0bGUJCQkJCQkJPSBUaGUgZm9sbG93aW5nIHJlc291cmNlcyBuZWVkIHRvIGJlIGNoZWNrZWQgb3V0IGR1cmluZyB0aGUgb3BlcmF0aW9uDQotU2VsZWN0RmlsZXNUb0NoZWNrb3V0X0NhbmNlbGVkTWVzc2FnZQkJCQkJCT0gT3BlcmF0aW9uIGNhbm5vdCBjb250aW51ZSBhcyByZXNvdXJjZXMgY2hlY2tvdXQgaGFzIGJlZW4gY2FuY2VsZWQNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhOWFiMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotLyoqDQotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlDQotICovDQotcHVibGljIGNsYXNzIERvbUludGVncmF0aW9uUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7DQotDQotCS8vIFRoZSBwbHVnLWluIElEDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uIjsNCi0NCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQlwcml2YXRlIHN0YXRpYyBEb21JbnRlZ3JhdGlvblBsdWdpbiBwbHVnaW47DQotCQ0KLQlwcml2YXRlIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOw0KLQkNCi0JLyoqDQotCSAqIFRoZSBjb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIERvbUludGVncmF0aW9uUGx1Z2luKCkgew0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zdGFydChjb250ZXh0KTsNCi0JCXBsdWdpbiA9IHRoaXM7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlwbHVnaW4gPSBudWxsOw0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBEb21JbnRlZ3JhdGlvblBsdWdpbiBnZXREZWZhdWx0KCkgew0KLQkJcmV0dXJuIHBsdWdpbjsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKGZpbmFsIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKQ0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obGFiZWxQcm92aWRlciwgImxhYmVsUHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsNCi0JfQ0KLQkNCi0JcHVibGljIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkNCi0Jew0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7DQotCX0NCi0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC91dGlsL1Byb2plY3RFeHBsb3JlclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC91dGlsL1Byb2plY3RFeHBsb3JlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODJmNjhmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvdXRpbC9Qcm9qZWN0RXhwbG9yZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBob2xkcyBtZXRob2RzIHRvIG1hbmlwdWxhdGUgUHJvamVjdEV4cGxvcmVyIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvamVjdEV4cGxvcmVyVXRpbCANCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvamVjdEV4cGxvcmVyVXRpbCBJTlNUQU5DRSA9IG5ldyBQcm9qZWN0RXhwbG9yZXJVdGlsKCk7DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZyb20gVUkgdGhyZWFkIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGV4cGxvcmVyIHtAbGluayBJVmlld1BhcnR9IGluIGNhc2UgaXQgaXMgYXZhaWxhYmxlIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIElWaWV3UGFydCBmaW5kUHJvamVjdEV4cGxvcmVyKCkNCi0Jew0KLQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW4gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOw0KLQkJaWYgKHdvcmtiZW5jaFdpbj09bnVsbCB8fCB3b3JrYmVuY2hXaW4uZ2V0QWN0aXZlUGFnZSgpPT1udWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCXJldHVybiB3b3JrYmVuY2hXaW4uZ2V0QWN0aXZlUGFnZSgpLmZpbmRWaWV3KCJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIik7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0N1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0N1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1ZjI1MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9DdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHRoYXQgYWRhcHRzIERPTSBvYmplY3RzIHdpdGggSXRlbSBwcm92aWRlciBhZGFwdGVycy4gRm9yIHtAbGluayBJU0VJQ2hpbGRMaXN0fSBhbmQgDQotICoge0BsaW5rIElXZWJTZXJ2aWNlQ2hpbGRMaXN0fSBpdCBjcmVhdGVzIHNwZWNpZmljIGFkYXB0ZXIgZm9yIG90aGVyIERPTSBvYmplY3RzIGRlbGVnYXRlcyB0bw0KLSAqIHtAbGluayBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeX0uDQotICogDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IA0KLXsNCi0JLyoqDQotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHJpdmF0ZSBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIA0KLQl7DQotCQlzdXBlcigpOw0KLQkJDQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVdlYlNlcnZpY2VDaGlsZExpc3QuY2xhc3MpOw0KLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTRUlDaGlsZExpc3QuY2xhc3MpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZUNoaWxkTGlzdEFkYXB0ZXIoZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvaikgDQotCXsNCi0JCXJldHVybiBuZXcgSVdlYlNlcnZpY2VDaGlsZExpc3QoKQ0KLQkJCXsNCi0JCQkJcHVibGljIEVMaXN0PElXZWJTZXJ2aWNlPiBnZXRXU0NoaWxkTGlzdCgpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2ouZ2V0V2ViU2VydmljZXMoKTsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2o7DQotCQkJCX0NCi0NCi0JCQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgDQotCQkJCXsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIA0KLQkJCQl7DQotCQkJCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZCBjdXJyZW50bHkNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSANCi0JCQkJew0KLQkJCQkJLy8gbm8gcHJvY2Vzc2luZyBuZWVkZWQgY3VycmVudGx5DQotCQkJCX0NCi0JCQl9Ow0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVJU0VJQ2hpbGRMaXN0QWRhcHRlcihmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qKSANCi0Jew0KLQkJcmV0dXJuIG5ldyBJU0VJQ2hpbGRMaXN0KCkNCi0JCQl7DQotCQkJCXB1YmxpYyBFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBnZXRTRUlDaGlsZExpc3QoKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gd3NQcm9qLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2o7DQotCQkJCX0NCi0NCi0JCQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgDQotCQkJCXsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIA0KLQkJCQl7DQotCQkJCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZCBjdXJyZW50bHkNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSANCi0JCQkJew0KLQkJCQkJLy8gbm8gcHJvY2Vzc2luZyBuZWVkZWQgY3VycmVudGx5DQotCQkJCX0NCi0JCQl9Ow0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKQ0KLQl7DQotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QgJiYgdHlwZSBpbnN0YW5jZW9mIENsYXNzKQ0KLQkJew0KLQkJCWlmKHR5cGUuZXF1YWxzKElXZWJTZXJ2aWNlQ2hpbGRMaXN0LmNsYXNzKSkNCi0JCQl7DQotCQkJCXJldHVybiBhZGFwdElXZWJTZXJ2aWNlQ2hpbGRMaXN0KChJV2ViU2VydmljZVByb2plY3Qpbm90aWZpZXIpOw0KLQkJCX0NCi0JCQllbHNlIGlmKHR5cGUuZXF1YWxzKElTRUlDaGlsZExpc3QuY2xhc3MpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFkYXB0SVNFSUNoaWxkTGlzdCgoSVdlYlNlcnZpY2VQcm9qZWN0KW5vdGlmaWVyKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdHlwZSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBBZGFwdGVyIGFkYXB0SVNFSUNoaWxkTGlzdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlmb3IoQWRhcHRlciBhZGFwdGVyIDogd3NQcm9qZWN0LmVBZGFwdGVycygpKQ0KLQkJew0KLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KSB7DQotCQkJCXJldHVybiBhZGFwdGVyOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZmluYWwgQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlSVNFSUNoaWxkTGlzdEFkYXB0ZXIod3NQcm9qZWN0KTsNCi0JCWFzc29jaWF0ZShhZGFwdGVyLCB3c1Byb2plY3QpOw0KLQkJDQotCQlyZXR1cm4gYWRhcHRlcjsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEFkYXB0ZXIgYWRhcHRJV2ViU2VydmljZUNoaWxkTGlzdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlmb3IoQWRhcHRlciBhZGFwdGVyIDogd3NQcm9qZWN0LmVBZGFwdGVycygpKQ0KLQkJew0KLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkgew0KLQkJCQlyZXR1cm4gYWRhcHRlcjsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWZpbmFsIEFkYXB0ZXIgYWRhcHRlciA9IGNyZWF0ZUlXZWJTZXJ2aWNlQ2hpbGRMaXN0QWRhcHRlcih3c1Byb2plY3QpOw0KLQkJYXNzb2NpYXRlKGFkYXB0ZXIsIHdzUHJvamVjdCk7DQotCQkNCi0JCXJldHVybiBhZGFwdGVyOwkJDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzBlM2RkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC51dGlsLlByb2plY3RFeHBsb3JlclV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklMb2FkaW5nV3NQcm9qZWN0LklMb2FkaW5nQ2FuY2VsZWQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklMb2FkaW5nV3NQcm9qZWN0LklMb2FkaW5nRHVtbXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RvbUxvYWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuSVdzRE9NUnVudGltZUluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5Xc0RPTVJ1bnRpbWVSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5GYWNldFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXI7DQotDQotLyoqIA0KLSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIERPTSByZWxhdGVkIG9iamVjdHMNCi0gKiANCi0gKiBAYXV0aG9yIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyDQotew0KLQlwcml2YXRlIE1hcDxJV3NET01SdW50aW1lRXh0ZW5zaW9uLCBJV3NEb21Mb2FkTGlzdGVuZXI+IGxvYWRMaXN0ZW5lcnMgPSBuZXcgSGFzaE1hcDxJV3NET01SdW50aW1lRXh0ZW5zaW9uLCBJV3NEb21Mb2FkTGlzdGVuZXI+KCk7IA0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKQ0KLQl7DQotCQl0aGlzKEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQ0KLQkgKi8NCi0JcHVibGljIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQ0KLQl7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oZmluYWwgT2JqZWN0IGNvbnRleHQpDQotCXsNCi0JCWlmIChjb250ZXh0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkNCi0JCXsNCi0JCQlyZXR1cm4gZ2V0V3NQcm9qZWN0KChJUHJvamVjdCkoKElBZGFwdGFibGUpIGNvbnRleHQpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpKTsNCi0JCX0NCi0JCWVsc2UgaWYoY29udGV4dCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KSANCi0JCXsNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgKChJTG9hZGluZ1dzUHJvamVjdCljb250ZXh0KS5pc0xvYWRDYW5jZWxlZCgpID8gbmV3IElMb2FkaW5nQ2FuY2VsZWQoKXt9IDogbmV3IElMb2FkaW5nRHVtbXkoKXt9IH07DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpDQotCQl7DQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXXsgYWRhcHRlckZhY3RvcnkuYWRhcHQoY29udGV4dCwgSVNFSUNoaWxkTGlzdC5jbGFzcyksDQotCQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChjb250ZXh0LCBJV2ViU2VydmljZUNoaWxkTGlzdC5jbGFzcykgfTsNCi0JCX0NCi0JCWVsc2UgaWYoY29udGV4dCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCU9iamVjdFtdIHdlYlNlcnZpY2VzID0gKChJV2ViU2VydmljZUNoaWxkTGlzdCljb250ZXh0KS5nZXRXU0NoaWxkTGlzdCgpLnRvQXJyYXkoKTsNCi0JCQkNCi0JCQlmb3IoaW50IGlpPTA7IGlpPHdlYlNlcnZpY2VzLmxlbmd0aDsgaWkrKykNCi0JCQl7DQotCQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdlYlNlcnZpY2VzW2lpXSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCQl9DQotCQkJDQotCQkJcmV0dXJuIHdlYlNlcnZpY2VzOw0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlPYmplY3RbXSBzRUlzID0gKChJU0VJQ2hpbGRMaXN0KWNvbnRleHQpLmdldFNFSUNoaWxkTGlzdCgpLnRvQXJyYXkoKTsNCi0JCQkNCi0JCQlmb3IoaW50IGlpPTA7IGlpPHNFSXMubGVuZ3RoOyBpaSsrKQ0KLQkJCXsNCi0JCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQoc0VJc1tpaV0sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQkJfQ0KLQkJCQ0KLQkJCXJldHVybiBzRUlzOw0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoKElXZWJTZXJ2aWNlKWNvbnRleHQpLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCWlmIChzZWkgPT0gbnVsbCkgew0KLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsNCi0JCQl9DQotCQkJDQotCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQoc2VpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJCXJldHVybiBuZXcgT2JqZWN0W117IHNlaSB9Ow0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgew0KLQkJCXJldHVybiBleHRyYWN0TWV0aG9kcygoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgY29udGV4dCk7DQotCQl9DQotCQllbHNlIGlmIChjb250ZXh0IGluc3RhbmNlb2YgSVdlYk1ldGhvZCkgew0KLQkJCXJldHVybiBleHRyYWN0UGFyYW1zKChJV2ViTWV0aG9kKWNvbnRleHQpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldFdzUHJvamVjdChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSANCi0Jew0KLQkJdHJ5IHsNCi0JCQlmaW5hbCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIHJ1bnRpbWUgPSBnZXRTdXBwb3J0aW5nUnVudGltZShwcm9qZWN0KTsNCi0JCQlpZiAocnVudGltZSA9PSBudWxsKSB7DQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOw0KLQkJCX0NCi0JCQkNCi0JCQkvLyBXUyBwcm9qZWN0IGlzIGxvYWRlZCBhbHJlYWR5DQotCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IGdldFdzUHJvamVjdChydW50aW1lLmdldERPTSgpLCBwcm9qZWN0KTsgDQotCQkJaWYgKHdzUHJvamVjdCAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQod3NQcm9qZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgd3NQcm9qZWN0IH07DQotCQkJfQ0KLQkJCQ0KLQkJCWFkZFJ1bnRpbWVMb2FkTGlzdGVuZXIocnVudGltZSk7DQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBMb2FkaW5nV3NQcm9qZWN0KHByb2plY3QsIGZhbHNlKSB9Ow0KLQkJfSANCi0JCWNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7IC8vICRKTC1FWEMkDQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IG5ldyBMb2FkaW5nV3NQcm9qZWN0KHByb2plY3QsIHRydWUpIH07IA0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdzRG9tTG9hZExpc3RlbmVyIGFkZFJ1bnRpbWVMb2FkTGlzdGVuZXIoZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydW50aW1lKSANCi0Jew0KLQkJSVdzRG9tTG9hZExpc3RlbmVyIGxvYWRMaXN0ZW5lciA9IGxvYWRMaXN0ZW5lcnMuZ2V0KHJ1bnRpbWUpOyANCi0JCWlmIChsb2FkTGlzdGVuZXIhPW51bGwpIHsNCi0JCQlyZXR1cm4gbG9hZExpc3RlbmVyOw0KLQkJfQ0KLQkJDQotCQlsb2FkTGlzdGVuZXIgPSBuZXcgTG9hZExpc3RlbmVyKHJ1bnRpbWUpOwkJDQotCQlsb2FkTGlzdGVuZXJzLnB1dChydW50aW1lLCBsb2FkTGlzdGVuZXIpOwkJDQotCQlydW50aW1lLmFkZExvYWRMaXN0ZW5lcihsb2FkTGlzdGVuZXIpOw0KLQkJDQotCQlyZXR1cm4gbG9hZExpc3RlbmVyOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZXh0cmFjdE1ldGhvZHMoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpIA0KLQl7DQotCQlmaW5hbCBMaXN0PElXZWJNZXRob2Q+IHdlYk1ldGhvZHMgPSBzZWkuZ2V0V2ViTWV0aG9kcygpOw0KLQkJZm9yIChJV2ViTWV0aG9kIHdlYk1ldGhvZCA6IHdlYk1ldGhvZHMpIHsNCi0JCQlhZGFwdGVyRmFjdG9yeS5hZGFwdCh3ZWJNZXRob2QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3ZWJNZXRob2RzLnRvQXJyYXkoKTsJCQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZXh0cmFjdFBhcmFtcyhmaW5hbCBJV2ViTWV0aG9kIG1ldGhvZCkgDQotCXsNCi0JCWZpbmFsIExpc3Q8SVdlYlBhcmFtPiBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOw0KLQkJZm9yIChJV2ViUGFyYW0gd2ViUGFyYW0gOiBwYXJhbXMpIHsNCi0JCQlhZGFwdGVyRmFjdG9yeS5hZGFwdCh3ZWJQYXJhbSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHBhcmFtcy50b0FycmF5KCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkNCi0Jew0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCkgDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gISgoSVdlYlNlcnZpY2VDaGlsZExpc3QpZWxlbWVudCkuZ2V0V1NDaGlsZExpc3QoKS5pc0VtcHR5KCk7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiAhKChJU0VJQ2hpbGRMaXN0KWVsZW1lbnQpLmdldFNFSUNoaWxkTGlzdCgpLmlzRW1wdHkoKTsNCi0JCX0NCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkNCi0JCXsNCi0JCQlyZXR1cm4gKChJV2ViU2VydmljZSkgZWxlbWVudCkuZ2V0U2VydmljZUVuZHBvaW50KCkgIT0gbnVsbDsgDQotCQl9DQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkNCi0JCXsNCi0JCQlyZXR1cm4gISgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSllbGVtZW50KS5nZXRXZWJNZXRob2RzKCkuaXNFbXB0eSgpOw0KLQkJfQ0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJNZXRob2QpDQotCQl7DQotCQkJcmV0dXJuICEoKElXZWJNZXRob2QpZWxlbWVudCkuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKTsNCi0JCX0NCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoZmluYWwgSURPTSBkb20sIGZpbmFsIElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCWlmIChkb20gPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlmb3IgKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgOiBkb20uZ2V0V2ViU2VydmljZVByb2plY3RzKCkpIHsNCi0JCQlpZih3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0LmdldE5hbWUoKSkpIHsNCi0JCQkJcmV0dXJuIHdzUHJvamVjdDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBnZXRTdXBwb3J0aW5nUnVudGltZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0KQ0KLQl7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVJbmZvPiBkb21SdW50aW1lSW5mb3MgPSBXc0RPTVJ1bnRpbWVSZWdpc3RyeS5nZXRSZWdpc3RlcmVkUnVudGltZXNJbmZvKCk7DQotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZhY2V0czsNCi0JCWZvciAoSVdzRE9NUnVudGltZUluZm8gZG9tUnVudGltZUluZm8gOiBkb21SdW50aW1lSW5mb3MpIA0KLQkJew0KLQkJCWZhY2V0cyA9IGRvbVJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKTsNCi0JCQlpZiAoaGFzRmFjZXQoZmFjZXRzLCBwcm9qZWN0KSkgew0KLQkJCQlyZXR1cm4gZ2V0RG9tUnVudGltZShkb21SdW50aW1lSW5mby5nZXRJZCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRmFjZXQoZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBmYWNldHMsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCWZvciAoU3RyaW5nIGZhY2V0SWQgOiBmYWNldHMua2V5U2V0KCkpIA0KLQkJew0KLQkJCWlmIChmYWNldElkID09IG51bGwgfHwgZmFjZXRzLmdldChmYWNldElkKSA9PSBudWxsKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQl0cnkgew0KLQkJCQlpZiAoKG5ldyBGYWNldFV0aWxzKCkpLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgZmFjZXRzLmdldChmYWNldElkKSwgZmFjZXRJZCwgdHJ1ZSkpew0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCX0NCi0JCQl9IA0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBnZXREb21SdW50aW1lKFN0cmluZyBydW50aW1lSWQpIHsNCi0JCXJldHVybiBXc0RPTVJ1bnRpbWVNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0RE9NUnVudGltZShydW50aW1lSWQpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ2xhc3MgdGhhdCBpcyB1c2VkIHRvIGxpc3RlbiB3aGVuIHRoZSBET00gbG9hZCB3aWxsIGJlIGZpbmlzaGVkLiBBZnRlciB0aGUgbG9hZCBoYXMgZmluaXNoZWQNCi0JICogdGhpcyBjbGFzcyB0cmF2ZXJzZXMgdGhlIHByb2plY3QgZXhwbG9yZXJzIHRyZWUgaW4gb3JkZXIgdG8gZmluZCBhbGwgaW5zdGFuY2VzIG9mDQotCSAqIHtAbGluayBJTG9hZGluZ1dzUHJvamVjdH0gYW5kIHN1YnN0aXR1dGUgdGhlbSB3aXRoIGxvYWRlZCB7QGxpbmsgSVdlYlNlcnZpY2VQcm9qZWN0fQ0KLQkgKiANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHJvdGVjdGVkIGNsYXNzIExvYWRMaXN0ZW5lciBpbXBsZW1lbnRzIElXc0RvbUxvYWRMaXN0ZW5lcg0KLQl7DQotCQlwcml2YXRlIGZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZTsNCi0JCQ0KLQkJcHVibGljIExvYWRMaXN0ZW5lcihmaW5hbCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIHJ1bnRpbWUpIA0KLQkJew0KLQkJCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShydW50aW1lLCAicnVudGltZSIpOyAvLyROT04tTkxTLTEkDQotCQkJdGhpcy5ydW50aW1lID0gcnVudGltZTsNCi0JCX0NCi0JCQkNCi0JCXB1YmxpYyB2b2lkIGZpbmlzaGVkKCkgDQotCQl7DQotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpDQotCQkJew0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSANCi0JCQkJew0KLQkJCQkJZmluYWwgSVZpZXdQYXJ0IHZpZXdQYXJ0ID0gUHJvamVjdEV4cGxvcmVyVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEV4cGxvcmVyKCk7DQotCQkJCQlpZiAodmlld1BhcnQgaW5zdGFuY2VvZiBDb21tb25OYXZpZ2F0b3IpIA0KLQkJCQkJew0KLQkJCQkJCWZpbmFsIENvbW1vblZpZXdlciBjb21tb25WaWV3ZXIgPSAoKENvbW1vbk5hdmlnYXRvcil2aWV3UGFydCkuZ2V0Q29tbW9uVmlld2VyKCk7DQotCQkJCQkJZm9yIChUcmVlSXRlbSBpdGVtIDogY29tbW9uVmlld2VyLmdldFRyZWUoKS5nZXRJdGVtcygpKSB7DQotCQkJCQkJCWV4Y2hhbmdlRHVtbXkoaXRlbSwgY29tbW9uVmlld2VyKTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9KTsNCi0JCX0JCQ0KLQ0KLQkJcHJvdGVjdGVkIHZvaWQgZXhjaGFuZ2VEdW1teShmaW5hbCBUcmVlSXRlbSB0cmVlSXRlbSwgZmluYWwgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlcikgDQotCQl7DQotCQkJaWYgKHRyZWVJdGVtID09IG51bGwgfHwgdHJlZUl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJaWYgKHRyZWVJdGVtLmdldERhdGEoKSBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KSB7DQotCQkJCWV4Y2hhbmdlVHJlZUl0ZW1EYXRhKHRyZWVJdGVtLCBjb21tb25WaWV3ZXIpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJZm9yIChUcmVlSXRlbSBjaGlsZCA6IHRyZWVJdGVtLmdldEl0ZW1zKCkpIHsNCi0JCQkJCWV4Y2hhbmdlRHVtbXkoY2hpbGQsIGNvbW1vblZpZXdlcik7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlwcml2YXRlIHZvaWQgZXhjaGFuZ2VUcmVlSXRlbURhdGEoZmluYWwgVHJlZUl0ZW0gdHJlZUl0ZW0sIGZpbmFsIENvbW1vblZpZXdlciBjb21tb25WaWV3ZXIpIA0KLQkJew0KLQkJCWZpbmFsIElMb2FkaW5nV3NQcm9qZWN0IGxvYWRpbmdQcm9qZWN0ID0gKElMb2FkaW5nV3NQcm9qZWN0KXRyZWVJdGVtLmdldERhdGEoKTsNCi0JCQl0cnkgew0KLQkJCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gZ2V0V3NQcm9qZWN0KHJ1bnRpbWUuZ2V0RE9NKCksIGxvYWRpbmdQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdzUHJvamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCQkJdHJlZUl0ZW0uc2V0RGF0YSh3c1Byb2plY3QpOw0KLQ0KLQkJCX0gY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsgLy8gJEpMLUVYQyQNCi0JCQkJdHJlZUl0ZW0uc2V0RGF0YShuZXcgTG9hZGluZ1dzUHJvamVjdChsb2FkaW5nUHJvamVjdC5nZXRQcm9qZWN0KCksIHRydWUpKTsNCi0JCQl9DQotCQkJDQotCQkJY29tbW9uVmlld2VyLnJlZnJlc2gobG9hZGluZ1Byb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIHZvaWQgc3RhcnRlZCgpIHsNCi0JCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBjbGFzcyBMb2FkaW5nV3NQcm9qZWN0IGltcGxlbWVudHMgSUxvYWRpbmdXc1Byb2plY3QNCi0Jew0KLQkJZmluYWwgSVByb2plY3QgcHJvamVjdDsNCi0JCWZpbmFsIGJvb2xlYW4gaXNDYW5jZWxlZDsNCi0JCQ0KLQkJcHVibGljIExvYWRpbmdXc1Byb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgYm9vbGVhbiBpc0NhbmNlbGVkKSB7DQotCQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHByb2plY3QsICJwcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQNCi0JCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0Ow0KLQkJCXRoaXMuaXNDYW5jZWxlZCA9IGlzQ2FuY2VsZWQ7DQotCQl9DQotCQkNCi0JCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgew0KLQkJCXJldHVybiBwcm9qZWN0Ow0KLQkJfQ0KLQ0KLQkJcHVibGljIGJvb2xlYW4gaXNMb2FkQ2FuY2VsZWQoKSB7DQotCQkJcmV0dXJuIGlzQ2FuY2VsZWQ7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk0ODRlOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvblBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdDYW5jZWxlZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdEdW1teTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLkltYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSURlc2NyaXB0aW9uUHJvdmlkZXI7DQotDQotLyoqDQotICogRE9NIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGV4dGVuZHMge0BsaW5rIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcn0gYnkgcHJvdmlkaW5nDQotICogaWNvbnMgYW5kIGxhYmVscyBmb3Igc29tZSBvYmplY3RzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIERPTSBhbmQgYWxzbyBvdmVycmlkZXMgc29tZQ0KLSAqIGxhYmVscw0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElEZXNjcmlwdGlvblByb3ZpZGVyDQotew0KLQkvKioNCi0JICogRGVmYXVsdCBDb25zdHJ1Y3RvciB1c2VzIHtAbGluayBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeX0gYXMgZGVmYXVsdA0KLQkgKiBhZGFwdGVyIGZhY3RvcnkgcHJvdmlkZWQgdG8gdGhlIGJhc2UgY2xhc3MuDQotCSAqLw0KLQlwdWJsaWMgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKCkNCi0Jew0KLQkJc3VwZXIoQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpOw0KLQkJDQotCQlEb21JbnRlZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkuc2V0TGFiZWxQcm92aWRlcih0aGlzKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQ0KLQl7DQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuIEltYWdlcy5JTlNUQU5DRS5nZXRJbWFnZShJbWFnZXMuSU1HX1dFQl9TRVJWSUNFX0dST1VQKTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuIEltYWdlcy5JTlNUQU5DRS5nZXRJbWFnZShJbWFnZXMuSU1HX1NFSV9HUk9VUCk7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCkgDQotCQl7DQotCQkJcmV0dXJuIEltYWdlcy5JTlNUQU5DRS5nZXRJbWFnZShJbWFnZXMuSU1HX0RPTV9XU19QUk9WSURFUik7DQotCQl9DQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUxvYWRpbmdEdW1teSB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUxvYWRpbmdDYW5jZWxlZCkgDQotCQl7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQ0KLQl7DQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfSmF4V3NXZWJTZXJ2aWNlc0xhYmVsOyANCi0JCX0NCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUxvYWRpbmdEdW1teSkgDQotCQl7DQotCQkJcmV0dXJuIERvbUludGVncmF0aW9uTWVzc2FnZXMuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdEdW1teUxhYmVsOw0KLQkJfQ0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0NhbmNlbGVkKSANCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfTG9hZGluZ0NhbmNlbGVkTGFiZWw7DQotCQl9CQkNCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9XZWJTZXJ2aWNlc0xhYmVsOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfU2VpTGFiZWw7DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBlbGVtZW50KQ0KLQl7DQotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuICgoSVdlYlNlcnZpY2UpZWxlbWVudCkuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkNCi0JCXsNCi0JCQlyZXR1cm4gKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWVsZW1lbnQpLmdldE5hbWUoKTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUxvYWRpbmdXc1Byb2plY3QpDQotCQl7DQotCQkJcmV0dXJuIERvbUludGVncmF0aW9uTWVzc2FnZXMuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0pheFdzV2ViU2VydmljZXNMYWJlbDsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9XZWJTZXJ2aWNlc0xhYmVsOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfU2VpTGFiZWw7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViTWV0aG9kKQ0KLQkJew0KLQkJCXJldHVybiAoKElXZWJNZXRob2QpZWxlbWVudCkuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKE9iamVjdCBlbGVtZW50KSANCi0Jew0KLQkJZm9yIChJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxhYmVsUHJvdmlkZXJMaXN0ZW5lciA6IGxhYmVsUHJvdmlkZXJMaXN0ZW5lcnMpIHsNCi0JCQlsYWJlbFByb3ZpZGVyTGlzdGVuZXIubGFiZWxQcm92aWRlckNoYW5nZWQobmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQodGhpcywgZWxlbWVudCkpOw0KLQkJfQ0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEltYWdlIGdldERlZmF1bHRJbWFnZShPYmplY3Qgb2JqZWN0KQ0KLQl7DQotCQkvLyBObyBkZmF1bHQgaW1hZ2VzIA0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01JdGVtVmFsdWVQcm9wZXJ0eVNvdXJjZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NSXRlbVZhbHVlUHJvcGVydHlTb3VyY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkNGY2MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01JdGVtVmFsdWVQcm9wZXJ0eVNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLlByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklET01Qcm9wZXJ0eVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGZhY3RvcnkgZm9yIHRoYXQgY3JlYXRlcyBhZGFwdGVyIGZyb20ge0BsaW5rIElET01Qcm9wZXJ0eVZhbHVlfSB0bw0KLSAqIHtAbGluayBJUHJvcGVydHlTb3VyY2V9IGludGVyZmFjZS4gVGhpcyBmYWN0b3J5IGlzIHJlZ2lzdGVyZWQgaW4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIGV4dGVuc2lvbg0KLSAqIHBvaW50IGFuZCBpcyBjYWxsZWQgd2hlbiBvYmplY3Qgb2YgdHlwZSB7QGxpbmsgSURPTVByb3BlcnR5VmFsdWV9IG5lZWRzIHRvIGJlDQotICogZGlzcGxheWVkIG9yIGVkaXRlZCBpbiBwcm9wZXJ0eSBzaGVldC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotcHVibGljIGNsYXNzIERPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSANCi17DQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQ0KLQkgKi8NCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSANCi0Jew0KLQkJYXNzZXJ0IGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElET01Qcm9wZXJ0eVZhbHVlOw0KLQkJDQotCQlmaW5hbCBJRE9NUHJvcGVydHlWYWx1ZSB3cmFwcGVyID0gKElET01Qcm9wZXJ0eVZhbHVlKWFkYXB0YWJsZU9iamVjdDsNCi0JCQ0KLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eVNvdXJjZSh3cmFwcGVyLmdldEVkaXRhYmxlVmFsdWUoKSwgd3JhcHBlcik7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQ0KLQkgKi8NCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7DQotCQlyZXR1cm4gbmV3IENsYXNzW10ge1Byb3BlcnR5U291cmNlLmNsYXNzfTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhMzM0M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgDQotew0KLQlwcml2YXRlIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5Ow0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgDQotCXsNCi0gICAgICAgIGlmIChhZGFwdGVyVHlwZS5pc0luc3RhbmNlKGFkYXB0YWJsZU9iamVjdCkpIA0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBhZGFwdGFibGVPYmplY3Q7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmIChhZGFwdGVyVHlwZSA9PSBJUHJvcGVydHlTb3VyY2VQcm92aWRlci5jbGFzcykgDQotICAgICAgICB7DQotICAgICAgICAJcmV0dXJuIGdldEFkYXB0ZXJGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgICAgICANCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIA0KLQl7DQotICAgICAgICByZXR1cm4gbmV3IENsYXNzW10gew0KLSAgICAgICAgCQlET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5jbGFzcywNCi0gICAgICAgIH07DQotCX0NCi0JDQotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBnZXRBZGFwdGVyRmFjdG9yeSgpDQotCXsNCi0JCWlmIChhZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7DQotCQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSUxvYWRpbmdXc1Byb2plY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSUxvYWRpbmdXc1Byb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjYyZWFhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lMb2FkaW5nV3NQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi0NCi0NCi0vKioNCi0gKiBBbiBpbnRlcmZhY2UgcHJlc2VudGluZyBub3QgbG9hZGVkIHdlYiBzZXJ2aWNlIHByb2plY3QuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgDQotICogdG8gYmUgYWRkZWQgdG8gdGhlIHByb2plY3QgZXhwbG9yZXIgV1MgdHJlZSBpbiBjYXNlcyB3aGVuIHRoZSBwcm9qZWN0IGlzIHJlbGV2YW50IA0KLSAqIGJ1dCBpdCBpcyBub3QgeWV0IGxvYWRlZCBieSBET00gbG9hZGVyLiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJTG9hZGluZ1dzUHJvamVjdCANCi17DQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSByZWxldmFudCBwcm9qZWN0DQotCSAqLw0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpOw0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gaWYgdGhlIERPTSBsb2FkaW5nIGhhcyBiZWVuIGNhbmNlbGVkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDYW5jZWxlZCgpOw0KLQkNCi0JLyoqDQotCSAqIEludGVyZmFjZSB1c2VkIHRvIGJlIGFkZGVkIHRvIHRoZSB0cmVlIGFzIGEgc3ViIG5vZGUgb2YgSU5vdExvYWRlZFdzUHJvamVjdCBub2RlDQotCSAqIGFuZCBkaXNwbGF5ZWQgd2l0aCB0ZXh0ICJMb2FkaW5nLi4uIi4NCi0JICogDQotCSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0JICovDQotCXB1YmxpYyBpbnRlcmZhY2UgSUxvYWRpbmdEdW1teSB7fTsNCi0JDQotCXB1YmxpYyBpbnRlcmZhY2UgSUxvYWRpbmdDYW5jZWxlZCB7fTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JU0VJQ2hpbGRMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lTRUlDaGlsZExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDRmNmI0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lTRUlDaGlsZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVNFSUNoaWxkTGlzdCBleHRlbmRzIEFkYXB0ZXINCi17DQotCXB1YmxpYyBFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBnZXRTRUlDaGlsZExpc3QoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JV2ViU2VydmljZUNoaWxkTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JV2ViU2VydmljZUNoaWxkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjM4MWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSVdlYlNlcnZpY2VDaGlsZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlQ2hpbGRMaXN0IGV4dGVuZHMgQWRhcHRlcg0KLXsNCi0JcHVibGljIEVMaXN0PElXZWJTZXJ2aWNlPiBnZXRXU0NoaWxkTGlzdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL1dlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9XZWJTZXJ2aWNlUHJvYmxlbXNEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE5ZDJiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL1dlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJvYmxlbXNMYWJlbERlY29yYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb20yUmVzb3VyY2VNYXBwZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciBleHRlbmRzIFByb2JsZW1zTGFiZWxEZWNvcmF0b3INCi17DQotCS8qKiBFbnVtIHRvIHJlcHJlc2VudCBkaWZmZXJlbnQgbWFya2VyIHR5cGVzICovDQotCXB1YmxpYyBlbnVtIFNldmVyaXR5IHtPSywgRVJST1IsIFdBUk5JTkd9Ow0KLQkNCi0JcHJpdmF0ZSBEb21VdGlsIGRvbVV0aWwgPSBEb21VdGlsLklOU1RBTkNFOw0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBpbnQgY29tcHV0ZUFkb3JubWVudEZsYWdzKE9iamVjdCBvYmopIA0KLQl7DQotCQlmaW5hbCBTZXZlcml0eSBzZXZlcml0eSA9IGRlZmluZVNldmVyaXR5KG9iaik7CQkNCi0JCWlmIChzZXZlcml0eSA9PSBTZXZlcml0eS5FUlJPUikgew0KLQkJCXJldHVybiBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUjsNCi0JCX0gDQotCQkNCi0JCWlmIChzZXZlcml0eSA9PSBTZXZlcml0eS5XQVJOSU5HKSB7DQotCQkJcmV0dXJuIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLldBUk5JTkc7DQotCQl9DQotCQkNCi0JCXJldHVybiAwOw0KLQl9CQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIHRoZSBvYmplY3QncyByZXNvdXJjZSBmb3IgbWFya2VycyBhbmQgZGVmaW5lcyB0aGUgc2V2ZXJpdHkgb2YgdGhlDQotCSAqIHByb2JsZW0gaWYgYW55LiANCi0JICogQHBhcmFtIG9iag0KLQkgKiBAcmV0dXJuIHRoZSBzZXZlcml0eSBjYWxjdWxhdGVkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIFNldmVyaXR5IGRlZmluZVNldmVyaXR5KGZpbmFsIE9iamVjdCBvYmopIA0KLQl7DQotCQl0cnkgDQotCQl7DQotCQkJLy8gcHJvY2VzcyBhZGRpdGlvbmFsIERPTSBvYmplY3RzIG5lZWRlZCBmb3IgVUkgLSBJV2ViU2VydmljZUNoaWxkTGlzdCBhbmQgSVNFSUNoaWxkTGlzdA0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkgew0KLQkJCQlyZXR1cm4gZGVmaW5lU2V2ZXJpdHlGb3JFTGlzdCgoKElXZWJTZXJ2aWNlQ2hpbGRMaXN0KW9iaikuZ2V0V1NDaGlsZExpc3QoKSk7DQotCQkJfQ0KLQkJCQ0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KSB7DQotCQkJCXJldHVybiBkZWZpbmVTZXZlcml0eUZvckVMaXN0KCgoSVNFSUNoaWxkTGlzdClvYmopLmdldFNFSUNoaWxkTGlzdCgpKTsNCi0JCQl9DQotCQkJDQotCQkJLy8gZG8gbm90IHByb2Nlc3Mgbm9uIERPTSBvYmplY3RzDQotCQkJaWYoICEob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgKSB7DQotCQkJCXJldHVybiBTZXZlcml0eS5PSzsNCi0JCQl9DQotCQkJDQotCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5KChFT2JqZWN0KSBvYmopOw0KLQkJfSANCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotDQotCQlyZXR1cm4gU2V2ZXJpdHkuT0s7DQotCX0NCi0JDQotCXByb3RlY3RlZCBTZXZlcml0eSBkZWZpbmVTZXZlcml0eUZvckVMaXN0KGZpbmFsIExpc3Q8PyBleHRlbmRzIEVPYmplY3Q+IGxpc3QpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCVNldmVyaXR5IHNldmVyaXR5ID0gU2V2ZXJpdHkuT0s7CQkNCi0JCWZvciAoRU9iamVjdCBlT2JqZWN0IDogbGlzdCkgDQotCQl7DQotCQkJU2V2ZXJpdHkgdGVtcFNldmVyaXR5ID0gZGVmaW5lU2V2ZXJpdHkoZU9iamVjdCk7DQotCQkJaWYgKHRlbXBTZXZlcml0eSA9PSBTZXZlcml0eS5FUlJPUikgew0KLQkJCQlyZXR1cm4gU2V2ZXJpdHkuRVJST1I7DQotCQkJfQ0KLQkJCQ0KLQkJCWlmICh0ZW1wU2V2ZXJpdHk9PVNldmVyaXR5LldBUk5JTkcpIHsNCi0JCQkJc2V2ZXJpdHkgPSBTZXZlcml0eS5XQVJOSU5HOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHNldmVyaXR5Ow0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgU2V2ZXJpdHkgZGVmaW5lU2V2ZXJpdHkoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JeyAJCQ0KLQkJZmluYWwgSVJlc291cmNlIHJlc291cmNlID0gRG9tMlJlc291cmNlTWFwcGVyLklOU1RBTkNFLmZpbmRSZXNvdXJjZShlT2JqZWN0KTsNCi0JCWlmIChyZXNvdXJjZSE9bnVsbCkgew0KLQkJCXJldHVybiBkZWZpbmVTZXZlcml0eShlT2JqZWN0LCByZXNvdXJjZSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBTZXZlcml0eS5PSzsNCi0JfQ0KLQkJDQotCXByb3RlY3RlZCBTZXZlcml0eSBkZWZpbmVTZXZlcml0eShmaW5hbCBFT2JqZWN0IGVPYmplY3QsIGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYgKCFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgew0KLQkJCXJldHVybiBTZXZlcml0eS5PSzsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgaW50IGRlcHRoID0gKHJlc291cmNlLmdldFR5cGUoKT09SVJlc291cmNlLlBST0pFQ1QpID8gSVJlc291cmNlLkRFUFRIX0lORklOSVRFIDogSVJlc291cmNlLkRFUFRIX1pFUk87DQotCQlmaW5hbCBJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lELCBmYWxzZSwgZGVwdGgpOw0KLQkJU2V2ZXJpdHkgc2V2ZXJpdHkgPSBTZXZlcml0eS5PSzsNCi0JCWZvciAoSU1hcmtlciBtYXJrZXIgOiBtYXJrZXJzKSANCi0JCXsNCi0JCQlpZiAoIWlzUmVsZXZhbnRGb3IoZU9iamVjdCwgbWFya2VyKSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJaW50IHRlbXBTZXZlcml0eSA9IChJbnRlZ2VyKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSk7DQotCQkJaWYgKHRlbXBTZXZlcml0eT09SU1hcmtlci5TRVZFUklUWV9FUlJPUikgew0KLQkJCQlyZXR1cm4gU2V2ZXJpdHkuRVJST1I7DQotCQkJfSANCi0NCi0JCQlpZih0ZW1wU2V2ZXJpdHk9PUlNYXJrZXIuU0VWRVJJVFlfV0FSTklORykgew0KLQkJCQlzZXZlcml0eSA9IFNldmVyaXR5LldBUk5JTkc7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuT0sgJiYgKGVPYmplY3QgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkpIA0KLQkJew0KLQkJCS8vIGZvciBiZWFuIHdpdGggZXhwbGljaXQgaW50ZXJmYWNlIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGludGVyZmFjZSBhcyB3ZWxsIA0KLQkJCS8vIGJlY2F1c2UgaXQgcmVzaWRlcyBpbiBhbm90aGVyIHJlc291cmNlDQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoKElXZWJTZXJ2aWNlKWVPYmplY3QpLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCWlmIChzZWkgIT0gbnVsbCAmJiAhc2VpLmlzSW1wbGljaXQoKSkgew0KLQkJCQlzZXZlcml0eSA9IGRlZmluZVNldmVyaXR5KHNlaSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gc2V2ZXJpdHk7DQotCX0NCi0NCi0JLyoqDQotCSAqIERlZmluZXMgaWYgPGNvZGU+bWFya2VyPC9jb2RlPiBpcyByZWxldmFudCBmb3IgPGNvZGU+ZU9iamVjdDwvY29kZT4uDQotCSAqIE9ubHkgZm9yIHdlYiBtZXRob2QgYW5kIHdlYiBwYXJhbWV0ZXIgd2UgbmVlZCB0byBkZWZpbmUgaWYgdGhlIG1hcmtlciBpcyByZWxldmFudA0KLQkgKiBiZWNhdXNlIHRoZXkgYXJlIG5vdCB1bmlxdWUgaW4gdGhlIHNjb3BlIG9mIHRoZSByZXNvdXJjZS4gRm9yIGV4YW1wbGUgaWYgdGhlcmUgaXMgYQ0KLQkgKiBtYXJrZXIgc2V0IG9uIHRoZSByZXNvdXJjZSBjb250YWluaW5nIFNFSSwgdGhlIFNFSSBzaG91bGQgYmUgbWFya2VkIGluIGFueSBjYXNlIA0KLQkgKiB3aGlsZSB0aGUgbWV0aG9kIG9ubHkgaW4gY2FzZSB3aGVuIHRoZSBlcnJvciBpcyBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgbWV0aG9kIG9yIA0KLQkgKiBtZXRob2QgcGFyYW1ldGVyLiANCi0JICogQHBhcmFtIGVPYmplY3QgdGhlIG9iamVjdCB0byBiZSB2YWxpZGF0ZWQNCi0JICogQHBhcmFtIG1hcmtlciB0aGUgcmVzb3VyY2UgbWFya2VyIA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIG1hcmtlciBpcyByZWxldmFudCBmb3IgPGNvZGU+ZU9iamVjdDwvY29kZT4gDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvcihmaW5hbCBFT2JqZWN0IGVPYmplY3QsIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlzd2l0Y2ggKGVPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0Q6DQotCQkJcmV0dXJuIGlzUmVsZXZhbnRGb3JNZXRob2QoKElXZWJNZXRob2QpZU9iamVjdCwgbWFya2VyKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOg0KLQkJCXJldHVybiBpc1JlbGV2YW50KGRvbVV0aWwuY2FsY1VuaXF1ZUltcGwoZU9iamVjdCksIG1hcmtlcik7DQotCQl9DQotCQkNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyBpZiA8Y29kZT5tYXJrZXI8L2NvZGU+IGlzIHJlbGV2YW50IGZvciA8Y29kZT53ZWJNZXRob2Q8L2NvZGU+Lg0KLQkgKiBDaGVja3MgaWYgdGhlIG1hcmtlciBpcyBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgbWV0aG9kIG9yIHNvbWUgb2YgaXQncyBwYXJhbWV0ZXJzLg0KLQkgKiBAcGFyYW0gd2ViTWV0aG9kIHRoZSBtZXRob2QgdG8gYmUgY2hlY2tlZA0KLQkgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgdG8gYmUgY2hlY2tlZA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgbWFya2VyIGlzIHJlbGV2YW50DQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8JDQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVsZXZhbnRGb3JNZXRob2QoZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0Jew0KLQkJaWYgKGlzUmVsZXZhbnQoZG9tVXRpbC5jYWxjVW5pcXVlSW1wbCh3ZWJNZXRob2QpLCBtYXJrZXIpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlBhcmFtIHdlYlBhcmFtIDogd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKSkgDQotCQl7DQotCQkJaWYgKGlzUmVsZXZhbnQoZG9tVXRpbC5jYWxjVW5pcXVlSW1wbCh3ZWJQYXJhbSksIG1hcmtlcikpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgbWFya2VyJ3Mge0BsaW5rIERvbVZhbGlkYXRpb25Db25zdGFudHMjSU1QTEVNRU5UQVRJT059IGF0dHJpYnV0ZSBoYXMgc2FtZQ0KLQkgKiB2YWx1ZSBhcyA8Y29kZT5pbXBsZW1lbnRhdGlvbjwvY29kZT4uDQotCSAqIEBwYXJhbSBpbXBsZW1lbnRhdGlvbiB0aGUgaW1wbGVtZW50YXRpb24gc2lnbmF0dXJlDQotCSAqIEBwYXJhbSBtYXJrZXIgdGhlIG1hcmtlciB0byBiZSBjaGVja2VkDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSBtYXJrZXIgaXMgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24NCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlbGV2YW50KGZpbmFsIFN0cmluZyBpbXBsZW1lbnRhdGlvbiwgZmluYWwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIE9iamVjdCBmb3VuZCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5JTVBMRU1FTlRBVElPTik7DQotCQlpZiAoZm91bmQgIT0gbnVsbCAmJiBmb3VuZC5lcXVhbHMoaW1wbGVtZW50YXRpb24pKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiZjEzNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL05hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFamJTZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLlByb2plY3RNYW5hZ2VtZW50VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbg0KLQkJaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUyIHsNCi0JcHJvdGVjdGVkIE9iamVjdCBzcmNPYmplY3Q7DQotDQotCXByaXZhdGUgSUphdmFQcm9qZWN0IHByb2plY3Q7DQotDQotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7DQotDQotCXByb3RlY3RlZCBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsNCi0JCXRoaXMoRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5PcGVuV1NSZXNvdXJjZUFjdGlvbl9OYW1lKTsNCi0NCi0JCXRoaXMudmlld2VyID0gdmlld2VyOw0KLQl9DQotDQotCXByb3RlY3RlZCBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oU3RyaW5nIHRleHQpIHsNCi0JCXN1cGVyKHRleHQpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKQ0KLQl7DQotCQlpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5OYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLk5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5FSkJBcmVhQWN0aW9uOw0KLQkJfQ0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgew0KLQkJYm9vbGVhbiBpc0VuYWJsZWQgPSBzdXBlci5pc0VuYWJsZWQoKSANCi0JCSYmIHRoaXMudmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcg0KLQkJJiYgdGhpcy5wcm9qZWN0ICE9bnVsbA0KLQkJJiYgUHJvamVjdE1hbmFnZW1lbnRVdGlscy5pc0VqYjNQcm9qZWN0KHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuIGlzRW5hYmxlZDsNCi0JCX0NCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pDQotCQl7DQotCQkJU2Vzc2lvbkJlYW4gc2Vzc2lvbkJlYW4gPSAoKFNlc3Npb25CZWFuKXNyY09iamVjdCk7DQotCQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFdlYlNlcnZpY2Uoc2Vzc2lvbkJlYW4pOw0KLQkJCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UNCi0JCQkJJiYgKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNyY09iamVjdCkuaXNJbXBsaWNpdCgpKQ0KLQkJew0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCXJ1bigpOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcnVuKCkgew0KLQkJaWYgKCFpc0VuYWJsZWQoKSkNCi0JCQlyZXR1cm47DQotDQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gbnVsbDsNCi0NCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKQ0KLQkJew0KLQkJCVNlc3Npb25CZWFuIHNlc3Npb25CZWFuID0gKChTZXNzaW9uQmVhbilzcmNPYmplY3QpOw0KLQkJCVN0cmluZyBlamJDbGFzcyA9IHNlc3Npb25CZWFuLmdldEVqYkNsYXNzKCk7DQotCQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFdlYlNlcnZpY2Uoc2Vzc2lvbkJlYW4pOw0KLQkJCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQ0KLQkJCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc0VJID0gd2ViU2VydmljZS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQlib29sZWFuIGlzSW1wbGljaXQgPSBzRUkuaXNJbXBsaWNpdCgpOw0KLQkJCVN0cmluZyBzRUlDbGFzczsNCi0JCQlpZiAoIWlzSW1wbGljaXQpew0KLQkJCQlTdHJpbmcgaW1wbCA9IHNFSS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCQlzRUlDbGFzcyA9IGltcGw7DQotCQkJfSBlbHNlIHsNCi0JCQkJc0VJQ2xhc3MgPSBlamJDbGFzczsNCi0JCQl9DQotICAgICAgICAgICAgdHJ5IHsNCi0JCQkJY3UgPSBwcm9qZWN0LmZpbmRUeXBlKHNFSUNsYXNzKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJSVJlc291cmNlIHJlc291cmNlID0gY3UuZ2V0UmVzb3VyY2UoKTsNCi0JCQkJbW92ZVRvU0VJTm9kZShyZXNvdXJjZSk7DQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJyZWQiLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJCXJldHVybjsNCi0JCQl9DQotICAgICAgICAgICAgDQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdHJ5IHsNCi0JCQkJY3UgPSBwcm9qZWN0LmZpbmRUeXBlKA0KLQkJCQkJCSgoSUphdmFXZWJTZXJ2aWNlRWxlbWVudCkgc3JjT2JqZWN0KQ0KLQkJCQkJCQkJLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsNCi0JCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkIiwgam1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCW1vdmVUb0VqYk5vZGUoY3UuZ2V0UmVzb3VyY2UoKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgSVdlYlNlcnZpY2UgaWYgc2Vzc2lvbkJlYW4gaGFzIGJlZW4gZXhwb3NlZCBhcyB3ZWIgc2VydmljZS4NCi0JICogQHBhcmFtIHNlc3Npb25CZWFuIGEgc2Vzc2lvbiBiZWFuLg0KLQkgKiBAcmV0dXJuIElXZWJTZXJ2aWNlIGlmIHNlc3Npb25CZWFuIGhhcyBiZWVuIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2UuIElmIHRoZSBzZXNzaW9uIGJlYW4gaGFzIG5vdCBiZWVuDQotCSAqIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2UgLSByZXR1cm5zIG51bGwuDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc2Vzc2lvbkJlYW4gaXMgbnVsbC4NCi0JICovDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKGZpbmFsIFNlc3Npb25CZWFuIHNlc3Npb25CZWFuKSANCi0Jew0KLQkJZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gZ2V0RG9tUnVudGltZSgpOw0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkgew0KLQkJICAgICAgcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIElET00gZG9tID0gZG9tUnVudGltZS5nZXRET00oKTsNCi0JCQlpZiAoZG9tID09IG51bGwpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQ0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3ZWJTZXJ2aWNlUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUoZG9tLCB0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CQkNCi0JCQlyZXR1cm4gRG9tVXRpbC5JTlNUQU5DRS5maW5kV3NCeUltcGxOYW1lKHdlYlNlcnZpY2VQcm9qZWN0LCBzZXNzaW9uQmVhbi5nZXRFamJDbGFzcygpKTsNCi0JCX0gDQotCQljYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZSkgeyAvLyAkSkwtRVhDJA0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERvbVJ1bnRpbWUoKSB7DQotCQlyZXR1cm4gV3NET01SdW50aW1lTWFuYWdlci5pbnN0YW5jZSgpLmdldERPTVJ1bnRpbWUoSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5JRCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb1NFSU5vZGUoSVJlc291cmNlIHJlc291cmNlKQ0KLQl7DQotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil0aGlzLnZpZXdlcjsNCi0JCUlTZWxlY3Rpb24gc2VsID0gbnVsbDsNCi0NCi0JCU9iamVjdFtdIGV4cGFuZGVkT2JqZWN0cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOw0KLQ0KLQkJT2JqZWN0W10gcHJvamVjdEVsZW1lbnRzID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcg0KLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IG51bGw7DQotDQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcHJvamVjdEVsZW1lbnRzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChwcm9qZWN0RWxlbWVudHNbaWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSB7DQotCQkJCXdzUHJvamVjdCA9IChJV2ViU2VydmljZVByb2plY3QpIHByb2plY3RFbGVtZW50c1tpaV07DQotCQkJCXRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCh3c1Byb2plY3QsIDIpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAod3NQcm9qZWN0ID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQ0KLQkJZm9yKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc0VJIDogd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCXsNCi0JCQl0cnkgew0KLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcHJvamVjdC5maW5kVHlwZSgNCi0JCQkJCQkoKElKYXZhV2ViU2VydmljZUVsZW1lbnQpIHNFSSkNCi0JCQkJCQkJCS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJDQotCQkJCWlmKGN1LmdldFJlc291cmNlKCkuZXF1YWxzKHJlc291cmNlKSkNCi0JCQkJew0KLQkJCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc0VJKTsNCi0JCQkJCVRyZWVQYXRoIHRyZWVQYXRoID0gZ2V0VHJlZVBhdGhGb3JTRUkodHJlZVZpZXdlciwNCi0JCQkJCQkJd3NQcm9qZWN0KTsNCi0JCQkJCU9iamVjdFtdIGVsZW1lbnRzVG9FeHBhbmQgPSBuZXcgT2JqZWN0W3RyZWVQYXRoDQotCQkJCQkJCS5nZXRTZWdtZW50Q291bnQoKV07DQotDQotCQkJCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIHsNCi0JCQkJCQlpZiAobm90QWxyZWFkeUV4cGFuZGVkKHRyZWVQYXRoLmdldFNlZ21lbnQoamopLA0KLQkJCQkJCQkJZXhwYW5kZWRPYmplY3RzKSkgew0KLQkJCQkJCQllbGVtZW50c1RvRXhwYW5kW2pqXSA9IHRyZWVQYXRoLmdldFNlZ21lbnQoamopOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0NCi0JCQkJCWZvciAoaW50IGpqID0gMDsgamogPCBlbGVtZW50c1RvRXhwYW5kLmxlbmd0aDsgamorKykgew0KLQkJCQkJCWlmIChlbGVtZW50c1RvRXhwYW5kW2pqXSAhPSBudWxsKSB7DQotCQkJCQkJCU9iamVjdFtdIHRtcCA9IGV4cGFuZGVkT2JqZWN0czsNCi0JCQkJCQkJZXhwYW5kZWRPYmplY3RzID0gbmV3IE9iamVjdFtleHBhbmRlZE9iamVjdHMubGVuZ3RoICsgMV07DQotDQotCQkJCQkJCWZvciAoaW50IGtrID0gMDsga2sgPCB0bXAubGVuZ3RoOyBraysrKSB7DQotCQkJCQkJCQlleHBhbmRlZE9iamVjdHNba2tdID0gdG1wW2trXTsNCi0JCQkJCQkJfQ0KLQ0KLQkJCQkJCQlleHBhbmRlZE9iamVjdHNbZXhwYW5kZWRPYmplY3RzLmxlbmd0aCAtIDFdID0gZWxlbWVudHNUb0V4cGFuZFtqal07DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7DQotCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cnJlZCIsIGptZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCX0NCi0JCSBzZXRFeHBhbmRlZEVsZW1lbnRzQW5kU2VsZWN0aW9uKHRyZWVWaWV3ZXIsIGV4cGFuZGVkT2JqZWN0cywgc2VsKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb0VqYk5vZGUoSVJlc291cmNlIHJlc291cmNlKSB7DQotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil0aGlzLnZpZXdlcjsNCi0JCUlTZWxlY3Rpb24gc2VsID0gbnVsbDsNCi0NCi0JCU9iamVjdFtdIGV4cGFuZGVkT2JqZWN0cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOw0KLQ0KLQkJT2JqZWN0W10gcHJvamVjdEVsZW1lbnRzID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcg0KLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJR3JvdXBFSkJQcm92aWRlciBlamJQcm92aWRlciA9IG51bGw7DQotCQlHcm91cEVqYlNlc3Npb24gZWpiU2Vzc2lvbiA9IG51bGw7DQotDQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcHJvamVjdEVsZW1lbnRzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChwcm9qZWN0RWxlbWVudHNbaWldIGluc3RhbmNlb2YgR3JvdXBFSkJQcm92aWRlcikgew0KLQkJCQllamJQcm92aWRlciA9IChHcm91cEVKQlByb3ZpZGVyKSBwcm9qZWN0RWxlbWVudHNbaWldOw0KLQkJCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZWpiUHJvdmlkZXIsIDEpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAoZWpiUHJvdmlkZXIgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotDQotCQlmb3IgKE9iamVjdCBlamJQcm92aWRlckNoaWxkIDogZWpiUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSkgew0KLQkJCWlmIChlamJQcm92aWRlckNoaWxkIGluc3RhbmNlb2YgR3JvdXBFamJTZXNzaW9uKSB7DQotCQkJCWVqYlNlc3Npb24gPSAoR3JvdXBFamJTZXNzaW9uKSBlamJQcm92aWRlckNoaWxkOw0KLQkJCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZWpiU2Vzc2lvbiwgMik7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGVqYlNlc3Npb24gPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCU9iamVjdFtdIGVqYnMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsNCi0NCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBlamJzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmICgoZWpic1tpaV0gaW5zdGFuY2VvZiBTZXNzaW9uQmVhbil8fChlamJzW2lpXSBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSkgew0KLQkJCQ0KLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBmaW5kSmF2YVByb2plY3QoZWpic1tpaV0pOw0KLQkJCQlJVHlwZSB0ID0gbnVsbDsNCi0JCQkJdHJ5IHsNCi0JCQkJCWlmKChlamJzW2lpXSBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKSkNCi0JCQkJCQl0ID0gamF2YVByb2plY3QuZmluZFR5cGUoKChTZXNzaW9uQmVhbillamJzW2lpXSkuZ2V0RWpiQ2xhc3MoKSk7DQotCQkJCQllbHNlDQotCQkJCQkJdCA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKCgoTWVzc2FnZURyaXZlbkJlYW4pZWpic1tpaV0pLmdldEVqYkNsYXNzKCkpOw0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCUlSZXNvdXJjZSByID0gdC5nZXRSZXNvdXJjZSgpOw0KLQkJCQkNCi0JCQkJaWYgKHIuZXF1YWxzKHJlc291cmNlKSkgew0KLQkJCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWpic1tpaV0pOw0KLQkJCQkJVHJlZVBhdGggdHJlZVBhdGggPSBnZXRUcmVlUGF0aEZvck9iamVjdCh0cmVlVmlld2VyLA0KLQkJCQkJCQllamJzW2lpXSk7DQotCQkJCQlleHBhbmRFbGVtZW50cyhleHBhbmRlZE9iamVjdHMsIHRyZWVQYXRoKTsNCi0NCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJIHNldEV4cGFuZGVkRWxlbWVudHNBbmRTZWxlY3Rpb24odHJlZVZpZXdlciwgZXhwYW5kZWRPYmplY3RzLCBzZWwpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGZpbmRKYXZhUHJvamVjdChPYmplY3QgZWpiKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVqYik7DQotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2opOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBzZXRFeHBhbmRlZEVsZW1lbnRzQW5kU2VsZWN0aW9uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlciwgT2JqZWN0W10gZXhwYW5kZWRPYmplY3RzLCBJU2VsZWN0aW9uIHNlbCkNCi0Jew0KLQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGV4cGFuZGVkT2JqZWN0cyk7DQotDQotCQlpZiAoc2VsICE9IG51bGwpIHsNCi0JCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwsIHRydWUpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgZXhwYW5kRWxlbWVudHMoT2JqZWN0W10gZXhwYW5kZWRPYmplY3RzLCBUcmVlUGF0aCB0cmVlUGF0aCkNCi0Jew0KLQkJDQotCQlPYmplY3RbXSBlbGVtZW50c1RvRXhwYW5kID0gbmV3IE9iamVjdFt0cmVlUGF0aC5nZXRTZWdtZW50Q291bnQoKV07DQotDQotCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIA0KLQkJew0KLQkJCWlmIChub3RBbHJlYWR5RXhwYW5kZWQodHJlZVBhdGguZ2V0U2VnbWVudChqaiksIGV4cGFuZGVkT2JqZWN0cykpIA0KLQkJCXsNCi0JCQkJZWxlbWVudHNUb0V4cGFuZFtqal0gPSB0cmVlUGF0aC5nZXRTZWdtZW50KGpqKTsNCi0JCQl9DQotCQl9DQotDQotCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIHsNCi0JCSAgICBpZiAoZWxlbWVudHNUb0V4cGFuZFtqal0gIT0gbnVsbCkgew0KLQkJICAgIAlPYmplY3RbXSB0bXAgPSBleHBhbmRlZE9iamVjdHM7DQotCQkgICAgICAgIGV4cGFuZGVkT2JqZWN0cyA9IG5ldyBPYmplY3RbZXhwYW5kZWRPYmplY3RzLmxlbmd0aCArIDFdOw0KLQ0KLQkJCQlmb3IgKGludCBrayA9IDA7IGtrIDwgdG1wLmxlbmd0aDsga2srKykgew0KLQkJCQkJZXhwYW5kZWRPYmplY3RzW2trXSA9IHRtcFtra107DQotCQkJCX0NCi0NCi0JCQkJZXhwYW5kZWRPYmplY3RzW2V4cGFuZGVkT2JqZWN0cy5sZW5ndGggLSAxXSA9IGVsZW1lbnRzVG9FeHBhbmRbampdOw0KLQkJICAgIH0NCi0JCX0NCi0JfQ0KLQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gbm90QWxyZWFkeUV4cGFuZGVkKE9iamVjdCBvYmosIE9iamVjdFtdIGV4cE9ianMpIHsNCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBleHBPYmpzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChleHBPYmpzW2lpXS5lcXVhbHMob2JqKSkgew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JcHJpdmF0ZSBUcmVlUGF0aCBnZXRUcmVlUGF0aEZvclNFSShUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCVRyZWVQYXRoW10gdHJlZVBhdGhzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOw0KLQ0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHRyZWVQYXRocy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAodHJlZVBhdGhzW2lpXS5nZXRMYXN0U2VnbWVudCgpIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdA0KLQkJCQkJJiYgY29udGFpbnModHJlZVBhdGhzW2lpXSwgd3NQcm9qZWN0KSkgew0KLQkJCQlyZXR1cm4gdHJlZVBhdGhzW2lpXTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFRyZWVQYXRoIHRyZWVQYXRoLCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlmb3IoaW50IGlpPTA7IGlpPHRyZWVQYXRoLmdldFNlZ21lbnRDb3VudCgpOyBpaSsrKQ0KLQkJew0KLQkJCWlmKHRyZWVQYXRoLmdldFNlZ21lbnQoaWkpLmVxdWFscyh3c1Byb2plY3QpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JcHJpdmF0ZSBUcmVlUGF0aCBnZXRUcmVlUGF0aEZvck9iamVjdChUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIE9iamVjdCBvYmopIHsNCi0JCVRyZWVQYXRoW10gdHJlZVBhdGhzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOw0KLQ0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHRyZWVQYXRocy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAodHJlZVBhdGhzW2lpXS5nZXRMYXN0U2VnbWVudCgpLmVxdWFscyhvYmopKSB7DQotCQkJCXJldHVybiB0cmVlUGF0aHNbaWldOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sDQotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCi0JCS8vIFRPRE8gSEFDSyENCi0JCXVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwNCi0JCQlJSmF2YVByb2plY3QgcHJvamVjdCkgew0KLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOw0KLQ0KLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGluIHRoZSB3b3JrYmVuY2guIFN1YmNsYXNzZXMgc2hvdWxkDQotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlYWN0IHRvIHRoZSBjaGFuZ2UuIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uDQotCSAqIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGlzIHNlbGVjdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS4NCi0JICogDQotCSAqIFdoZW4gdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiwgdGhlIHN1cGVyIG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBpbnZva2VkLg0KLQkgKiBJZiB0aGUgc3VwZXIgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoaXMgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4gZmFsc2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2VsDQotCSAqICAgICAgICAgICAgdGhlIG5ldyBzdHJ1Y3R1cmVkIHNlbGVjdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsNCi0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCXNyY09iamVjdCA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcigpIHsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi0JDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkvLyBEaXNwb3NlDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7DQotCQkvLyBpbml0DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsNCi0JCXJ1bldpdGhFdmVudChldmVudCk7DQotDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL09wZW5XU1Jlc291cmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJmODZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCi0NCi1wdWJsaWMgY2xhc3MgT3BlbldTUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZTIgDQotew0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNyY09iamVjdDsNCi0NCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgcHJvamVjdDsNCi0JDQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByaXZhdGUgRG9tVXRpbCB1dGlsID0gRG9tVXRpbC5JTlNUQU5DRTsNCi0NCi0JcHJvdGVjdGVkIE9wZW5XU1Jlc291cmNlQWN0aW9uKCkgew0KLQkJdGhpcyhEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLk9wZW5XU1Jlc291cmNlQWN0aW9uX05hbWUpOw0KLQl9DQotDQotCXByb3RlY3RlZCBPcGVuV1NSZXNvdXJjZUFjdGlvbihTdHJpbmcgdGV4dCkgew0KLQkJc3VwZXIodGV4dCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsNCi0JCWJvb2xlYW4gaXNFbmFibGVkID0gc3VwZXIuaXNFbmFibGVkKCkNCi0JCSYmIHRoaXMucHJvamVjdCE9bnVsbDsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuIGlzRW5hYmxlZDsNCi0JCX0NCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkNCi0JCXsNCi0JCQlyZXR1cm4gaXNFbmFibGVkOw0KLQkJfQ0KLQkJDQotCQlpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBJV2ViTWV0aG9kKQ0KLQkJew0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIElXZWJQYXJhbSkNCi0JCXsNCi0JCQlyZXR1cm4gaXNFbmFibGVkOw0KLQkJfQkJDQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsNCi0JCXJ1bigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcnVuKCkgew0KLQkJaWYgKCFpc0VuYWJsZWQoKSkNCi0JCQlyZXR1cm47DQotDQotCQlJQ29tcGlsYXRpb25Vbml0IGN1Ow0KLQkJSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSBudWxsOw0KLQkJSVdlYlBhcmFtIHdlYlBhcmFtID0gbnVsbDsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYk1ldGhvZCkNCi0JCXsNCi0JCQl3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClzcmNPYmplY3Q7DQotCQkJc3JjT2JqZWN0ID0gc2VpOw0KLQkJfQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlBhcmFtKQ0KLQkJew0KLQkJCXdlYlBhcmFtID0gKElXZWJQYXJhbSlzcmNPYmplY3Q7DQotCQkJd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJCXNyY09iamVjdCA9IHNlaTsNCi0JCX0NCi0JCQ0KLQkJdHJ5IHsNCi0NCi0JCQljdSA9IHByb2plY3QuZmluZFR5cGUoKChJSmF2YVdlYlNlcnZpY2VFbGVtZW50KSBzcmNPYmplY3QpLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQ0KLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7DQotDQotCQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzYyA9IGdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihjdS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7DQotCQkNCi0JCQljdSA9IGdldENVVG9PcGVuKGN1LCB3ZWJNZXRob2QpOwkJDQotCQkJaWYgKGN1ID09IG51bGwpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIGxvY2F0ZSBjb250YWluaW5nIENVIHRvIG9wZW4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJDQotCQkJSUZpbGUgZmlsZSA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihjdS5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkpWzBdOyANCi0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZGVzYy5nZXRJZCgpKTsNCi0JCQkNCi0JCQlJTWFya2VyIG1hcmtlciA9IGZpbGUuY3JlYXRlTWFya2VyKElNYXJrZXIuVEVYVCk7DQotCQkJSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsNCi0JCQkNCi0JCQltYXAucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgZ2V0TWFya2VyUG9zaXRpb24oY3UsIHdlYk1ldGhvZCwgZmFsc2UpKTsNCi0JCQltYXAucHV0KElNYXJrZXIuQ0hBUl9FTkQsIGdldE1hcmtlclBvc2l0aW9uKGN1LCB3ZWJNZXRob2QsIHRydWUpKTsNCi0JCQkNCi0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhtYXApOw0KLQkJCQ0KLQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsNCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gb3BlbiBwYXJ0IGVkaXRvciIsIHBpZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKGNlLmdldE1lc3NhZ2UoKSwgY2UpOyANCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIGludCBnZXRNYXJrZXJQb3NpdGlvbihJQ29tcGlsYXRpb25Vbml0IGN1LCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgYm9vbGVhbiBlbmRQb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7DQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgdHlwZXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmICh3ZWJNZXRob2QgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXJldHVybiBnZXRQb3NpdGlvbih0eXBlc1tpaV0sIGVuZFBvcyk7DQotCQkJfQ0KLQ0KLQkJCWZpbmFsIElNZXRob2QgbWV0aG9kID0gdXRpbC5maW5kTWV0aG9kKHR5cGVzW2lpXSwgd2ViTWV0aG9kKTsNCi0JCQlpZiAobWV0aG9kPT1udWxsKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gZ2V0UG9zaXRpb24obWV0aG9kLCBlbmRQb3MpOw0KLQkJfQ0KLQkJCQkNCi0JCXJldHVybiAwOw0KLQl9DQotCQ0KLQlwcml2YXRlIGludCBnZXRQb3NpdGlvbihJTWVtYmVyIG1lbWJlciwgYm9vbGVhbiBlbmRQb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCXJldHVybiBtZW1iZXIuZ2V0TmFtZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgKyAoKGVuZFBvcykgPyBtZW1iZXIuZ2V0TmFtZVJhbmdlKCkuZ2V0TGVuZ3RoKCkgOiAwKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGdldENVVG9PcGVuKElDb21waWxhdGlvblVuaXQgY3UsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlpZiAod2ViTWV0aG9kID09IG51bGwpIA0KLQkJew0KLQkJCXJldHVybiBjdTsNCi0JCX0NCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJZmluYWwgSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7CQkJDQotCQkJZm9yKGludCBpaT0wOyBpaTx0eXBlcy5sZW5ndGg7IGlpKyspDQotCQkJew0KLQkJCQlJTWV0aG9kIG1ldGhvZCA9IHV0aWwuZmluZE1ldGhvZCh0eXBlc1tpaV0sIHdlYk1ldGhvZCk7DQotCQkJCWlmIChtZXRob2QgIT0gbnVsbCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHR5cGVzW2lpXS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlmb3IoaW50IGlpPTA7IGlpPHR5cGVzLmxlbmd0aDsgaWkrKykNCi0JCQl7DQotCQkJCUlUeXBlW10gc3VwZXJJbnRmVHlwZXMgPSB0eXBlc1tpaV0ubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldFN1cGVySW50ZXJmYWNlcyh0eXBlc1tpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajxzdXBlckludGZUeXBlcy5sZW5ndGg7IGpqKyspDQotCQkJCXsNCi0JCQkJCUlDb21waWxhdGlvblVuaXQgY3VUb09wZW4gPSBnZXRDVVRvT3BlbihzdXBlckludGZUeXBlc1tqal0uZ2V0Q29tcGlsYXRpb25Vbml0KCksIHdlYk1ldGhvZCk7DQotCQkJCQkNCi0JCQkJCWlmKGN1VG9PcGVuIT1udWxsKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiBjdVRvT3BlbjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJSVR5cGUgc3VwZXJDbGFzc1R5cGUgPSB0eXBlc1tpaV0ubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldFN1cGVyY2xhc3ModHlwZXNbaWldKTsNCi0JCQkJDQotCQkJCUlDb21waWxhdGlvblVuaXQgY3VUb09wZW4gPSBnZXRDVVRvT3BlbihzdXBlckNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgd2ViTWV0aG9kKTsNCi0JCQkJCQ0KLQkJCQlpZihjdVRvT3BlbiE9bnVsbCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGN1VG9PcGVuOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcihqbWUuZ2V0TWVzc2FnZSgpLCBqbWUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KLQkJdXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSUphdmFQcm9qZWN0IHByb2plY3QsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKSB7DQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQotDQotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0Ow0KLQkJdGhpcy5zZWkgPSBzZWk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoZSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBpbiB0aGUgd29ya2JlbmNoLiBTdWJjbGFzc2VzIHNob3VsZA0KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZWFjdCB0byB0aGUgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbg0KLQkgKiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuDQotCSAqIA0KLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSBzdXBlciBtZXRob2QgbXVzdCBhbHdheXMgYmUgaW52b2tlZC4NCi0JICogSWYgdGhlIHN1cGVyIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGlzIG1ldGhvZCBtdXN0IGFsc28gcmV0dXJuIGZhbHNlLg0KLQkgKiANCi0JICogQHBhcmFtIHNlbA0KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RydWN0dXJlZCBzZWxlY3Rpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7DQotCQlpZiAoIXN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlzcmNPYmplY3QgPSBzLmdldEZpcnN0RWxlbWVudCgpOw0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkvLyBEaXNwb3NlDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7DQotCQkvLyBpbml0DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsNCi0JCXJ1bldpdGhFdmVudChldmVudCk7DQotDQotCX0NCi0JDQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXIoKSB7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotDQotCXByaXZhdGUgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7DQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgew0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL1dTQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRmOGRkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTWVudUNvbnN0YW50czsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgV1NBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIA0KLXsNCi0JcHJpdmF0ZSBPcGVuV1NSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOw0KLQ0KLQlwcml2YXRlIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbiBuYXZpZ2F0ZUFjdGlvbjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSANCi0Jew0KLQkJaWYob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgDQotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgb3BlbkFjdGlvbik7DQotCQkNCi0JCWlmKG5hdmlnYXRlQWN0aW9uLmlzRW5hYmxlZCgpKQ0KLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSwgbmF2aWdhdGVBY3Rpb24pOwkNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSANCi0Jew0KLQkJaWYgKGdldENvbnRleHQoKT09bnVsbCB8fCBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQ0KLQkJCXJldHVybjsNCi0JCQ0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7DQotCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCW5hdmlnYXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCW5hdmlnYXRlQWN0aW9uLnNldFRleHQobmF2aWdhdGVBY3Rpb24uZ2V0VGV4dCgpKTsNCi0JCQ0KLQkJaWYgKG9wZW5BY3Rpb24uaXNFbmFibGVkKCkpDQotCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuQWN0aW9uKTsNCi0JCQ0KLQkJaWYobmF2aWdhdGVBY3Rpb24uaXNFbmFibGVkKCkpDQotCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOX1dJVEgsIG5hdmlnYXRlQWN0aW9uKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBzaXRlKSB7DQotCQlzdXBlci5pbml0KHNpdGUpOw0KLQkJDQotCQlvcGVuQWN0aW9uID0gbmV3IE9wZW5XU1Jlc291cmNlQWN0aW9uKCk7DQotCQluYXZpZ2F0ZUFjdGlvbiA9IGluaXROYXZpZ2F0ZUFjdGlvbihzaXRlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbiBpbml0TmF2aWdhdGVBY3Rpb24oSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgc2l0ZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oc2l0ZS5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEFjdGlvbkNvbnRleHQgY29udGV4dCkgew0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIA0KLQkJew0KLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29udGV4dC5nZXRTZWxlY3Rpb24oKTsNCi0JCQkNCi0JCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikNCi0JCQl7DQotCQkJCVRyZWVQYXRoW10gcGF0aHMgPSAoKElUcmVlU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0UGF0aHNGb3Ioc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsNCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7DQotCQkJCQ0KLQkJCQlmb3IoaW50IGlpPTA7IGlpPHBhdGhzLmxlbmd0aDsgaWkrKykNCi0JCQkJew0KLQkJCQkJVHJlZVBhdGggcGF0aCA9IHBhdGhzW2lpXTsNCi0JCQkJCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gbnVsbDsNCi0JCQkJCQ0KLQkJCQkJZm9yKGludCBqaj0wOyBqajxwYXRoLmdldFNlZ21lbnRDb3VudCgpOyBqaisrKQ0KLQkJCQkJew0KLQkJCQkJCWlmKHBhdGguZ2V0U2VnbWVudChqaikgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJCQkJCXsNCi0JCQkJCQkJc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpcGF0aC5nZXRTZWdtZW50KGpqKTsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCQlmb3IoaW50IGpqPTA7IGpqPHBhdGguZ2V0U2VnbWVudENvdW50KCk7IGpqKyspDQotCQkJCQl7DQotCQkJCQkJaWYocGF0aC5nZXRTZWdtZW50KGpqKSBpbnN0YW5jZW9mIElQcm9qZWN0KQ0KLQkJCQkJCXsNCi0JCQkJCQkJcHJvamVjdCA9IChJUHJvamVjdClwYXRoLmdldFNlZ21lbnQoamopOw0KLQkJCQkJCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uLCBnZXRKYXZhUHJvamVjdChwcm9qZWN0KSwgc2VpKTsNCi0JCQkJCQkJbmF2aWdhdGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24sIGdldEphdmFQcm9qZWN0KHByb2plY3QpKTsNCi0JCQkJCQkJc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsNCi0JCQkJCQkJcmV0dXJuOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCQluYXZpZ2F0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQotCQl9DQotCQkNCi0JCXN1cGVyLnNldENvbnRleHQoY29udGV4dCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1ZWMzYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01SdW50aW1lTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsNCi0NCi0vKioNCi0gKiB7QGxpbmsgSVZhbGlkYXRpb25Db250ZXh0fSBpbXBsZW1lbnRvci4gQWN0cyBhcyBoZWxwZXIgY2xhc3MgZm9yIHZhbGlkYXRpb24uIFVzZWQNCi0gKiBieSB7QGxpbmsgRG9tVmFsaWRhdGlvbk1hbmFnZXJ9IHRvIHJldHJpZXZlIERPTSBtb2RlbC4NCi0gKiAgDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpDQotcHVibGljIGNsYXNzIERvbVZhbGlkYXRpb25IZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hDb250ZXh0DQotewkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gcmVnaXN0ZXJzIG1vZGVscyB0aGF0IHRoaXMgaGVscGVyIHdpbGwgc3VwcG9ydC4gUmVnaXN0cmF0aW9uIGlzIGRvbmUgDQotCSAqIGJ5IHNldHRpbmcgbW9kZWwgJ3N5bWJvbGljTmFtZScgYW5kIG1ldGhvZCB0byBiZSBjYWxsZWQgZm9yIHRoaXMgbWV0aG9kIHRvIGJlIHJldHJpZXZlZA0KLQkgKi8NCi0JcHVibGljIERvbVZhbGlkYXRpb25IZWxwZXIoKQ0KLQl7DQotCQlyZWdpc3Rlck1vZGVsKCJ3ZWJTZXJ2aWNlUHJvamVjdCIsICJnZXRXZWJTZXJ2aWNlUHJvamVjdCIsIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCX0NCi0JDQotCS8qKg0KLQkgKiBFeGVjdXRlZCBieSB7QGxpbmsgV29ya2JlbmNoQ29udGV4dH0gd2hlbiB7QGxpbmsgV29ya2JlbmNoQ29udGV4dCNsb2FkTW9kZWwoU3RyaW5nLCBPYmplY3RbXSl9IGlzIGNhbGxlZA0KLQkgKiBhbmQgZmluZHMgdGhlIGNvcnJlc3BvbmRpbmcgdG8ge0BsaW5rICNnZXRQcm9qZWN0KCl9IHtAbGluayBJV2ViU2VydmljZVByb2plY3R9DQotCSAqIA0KLQkgKiBAcGFyYW0gZG9tSWQNCi0JICogQHJldHVybiBmb3VuZCB7QGxpbmsgSVdlYlNlcnZpY2VQcm9qZWN0fSBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXZWJTZXJ2aWNlUHJvamVjdChmaW5hbCBTdHJpbmcgZG9tSWQpIA0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZG9tSWQsICJkb21JZCIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IGdldERvbVJ1bnRpbWUoZG9tSWQpOw0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQl0cnkgew0KLQkJCWZpbmFsIElET00gZG9tID0gZG9tUnVudGltZS5nZXRET00oKTsNCi0JCQlpZiAoZG9tPT1udWxsKSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZShkb20sIGdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJfSANCi0JCWNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7IC8vICRKTC1FWEMkDQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCX0NCi0NCi0JcHJvdGVjdGVkIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZ2V0RG9tUnVudGltZShmaW5hbCBTdHJpbmcgZG9tSWQpIHsNCi0JCXJldHVybiBXc0RPTVJ1bnRpbWVNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0RE9NUnVudGltZShkb21JZCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMmYyNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC5wbHVnaW4uRG9tSW50ZWdyYXRpb25QbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklTRUlDaGlsZExpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklXZWJTZXJ2aWNlQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uRG9tVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSURvbVZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsNCi0NCi0vKioNCi0gKiBSZWdpc3RlcmVkIHRvIFdTVCB2YWxpZGF0aW9uIGZyYW1ld29yayBJVmFsaWRhdG9yLiBSZWNlaXZlcyBub3RpZmljYXRpb25zIGZvciANCi0gKiB2YWxpZGF0aW9uIHRvIGJlIHBlcmZvcm1lZCBhbmQgY2FsbHMgcmVnaXN0ZXJlZCBET00gdmFsaWRhdG9ycyB0byBwZXJmb3JtIHRoZQ0KLSAqIHJlYWwgdmFsaWRhdGlvbi4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIERvbVZhbGlkYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYg0KLXsNCi0JcHVibGljIHZvaWQgY2xlYW51cChmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsJDQotCQkvLyBubyByZXNvdXJjZXMgZm9yIGNsZWFuIHVwDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsNCi0JCXZhbGlkYXRlSW5Kb2IoY29udGV4dCwgcmVwb3J0ZXIpOw0KLQl9CQ0KLQ0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIpDQotCXsNCi0JCWNsZWFuTWFya2VycygoSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCkgY29udGV4dCk7DQotCQkNCi0JCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7DQotCQlmb3IgKElEb21WYWxpZGF0b3IgdmFsaWRhdG9yIDogZ2V0VmFsaWRhdG9ycygpKSANCi0JCXsNCi0JCQl3c1Byb2plY3QgPSAoSVdlYlNlcnZpY2VQcm9qZWN0KWNvbnRleHQubG9hZE1vZGVsKCJ3ZWJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmcgW117dmFsaWRhdG9yLmdldFN1cHBvcnRlZERvbVJ1bnRpbWUoKX0pOyAvLyROT04tTkxTLTEkDQotCQkJaWYgKHdzUHJvamVjdCA9PSBudWxsKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQl2YWxpZGF0b3IudmFsaWRhdGUod3NQcm9qZWN0KTsJCQkNCi0JCQlyZWZyZXNoVHJlZSh3c1Byb2plY3QpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gSVZhbGlkYXRvckpvYi5PS19TVEFUVVM7DQotCX0NCi0JDQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFRyZWUoZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCkgDQotCXsNCi0JCWZpbmFsIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcigpOw0KLQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSZWZyZXNoUnVubmFibGUobGFiZWxQcm92aWRlciwgd3NQcm9qZWN0KSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcigpDQotCXsNCi0JCXJldHVybiBEb21JbnRlZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbk1hcmtlcnMoSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQ0KLQl7DQotCQl0cnkgew0KLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBjb250ZXh0LmdldFByb2plY3QoKTsNCi0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsNCi0JCQkJcHJvamVjdC5kZWxldGVNYXJrZXJzKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lELCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOw0KLQkJCX0NCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQkJDQotCX0NCi0NCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SURvbVZhbGlkYXRvcj4gZ2V0VmFsaWRhdG9ycygpDQotCXsNCi0JCXJldHVybiBEb21WYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmdldFJlZ2lzdGVyZWRWYWxpZGF0b3JzKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDbGFzcyB0aGF0IGZpcmVzIGxhYmVsIGNoYW5nZWQgZXZlbnQgdG8gdGhlIGxhYmVsIHByb3ZpZGVyIHRvIGFwcGx5IHZhbGlkYXRpb24NCi0JICogcmVzdWx0cyBpbiB0aGUgZGlzcGxheWVkIHRyZWUgLSBpLmUuIGRlY29yYXRlIGltYWdlcw0KLQkgKiANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHJvdGVjdGVkIGNsYXNzIFJlZnJlc2hSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIA0KLQl7DQotCQlwcml2YXRlIGZpbmFsIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOw0KLQkJcHJpdmF0ZSBmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0Ow0KLQkJDQotCQlwdWJsaWMgUmVmcmVzaFJ1bm5hYmxlKGZpbmFsIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KSB7DQotCQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsNCi0JCQl0aGlzLndzUHJvamVjdCA9IHdzUHJvamVjdDsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIHZvaWQgcnVuKCkgDQotCQl7DQotCQkJbGFiZWxQcm92aWRlci5maXJlTGFiZWxQcm92aWRlckNoYW5nZWQod3NQcm9qZWN0KTsNCi0JCQkNCi0JCQlmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQoSVNFSUNoaWxkTGlzdC5jbGFzcyk7DQotCQkJZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKElXZWJTZXJ2aWNlQ2hpbGRMaXN0LmNsYXNzKTsNCi0JCQkNCi0JCQlmaW5hbCBUcmVlSXRlcmF0b3I8RU9iamVjdD4gYWxsQ2hpbGRzID0gd3NQcm9qZWN0LmVBbGxDb250ZW50cygpOw0KLQkJCXdoaWxlIChhbGxDaGlsZHMuaGFzTmV4dCgpKSB7DQotCQkJCWxhYmVsUHJvdmlkZXIuZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGFsbENoaWxkcy5uZXh0KCkpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcHJpdmF0ZSB2b2lkIGZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChmaW5hbCBDbGFzczw/PiBhZGFwdGVyQ2xhc3MpDQotCQl7DQotCQkJZmluYWwgQWRhcHRlciBhZGFwdGVyID0gQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod3NQcm9qZWN0LCBhZGFwdGVyQ2xhc3MpOw0KLQkJCWlmIChhZGFwdGVyID09IG51bGwpIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlsYWJlbFByb3ZpZGVyLmZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChhZGFwdGVyKTsJDQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzkzODc2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjYTY4ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTtzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW4NCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24sDQotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsDQotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLA0KLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZQ0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyIsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW47eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnZhbGlkYXRpb24ucHJvdmlkZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uaW1wbCwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplciwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnByb3ZpZGVyLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uaW1wbCwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ubWVzc2FnZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5zZWksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYm1ldGhvZCwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2VicGFyYW0sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnNlcnZpY2UNCi1JbXBvcnQtUGFja2FnZTogamF2YXguandzDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTBhZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMTUsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FhZTI0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDAyMzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIExhbmd1YWdlIEZpbGUgZm9yIHRoaXMgUGx1Z2luDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgR2VuZXJpYyBMYWJlbCBhbmQgRGVzY3JpcHRpb24NCi1CdW5kbGUtTmFtZS4wPUpBWC1XUyBET00gcnVudGltZSBwbHVnLWluIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KLQ0KLURvbVZhbGlkYXRvcnNFeHRlbnNpb25fTmFtZSA9IERPTSBWYWxpZGF0b3INCi1Eb21SdW50aW1lc0V4dGVuc2lvbl9OYW1lID0gRE9NIFJ1bnRpbWVzDQotRXh0ZW5zaW9uUG9pbnQtTmFtZS4zID0gSkVFNSBET00gY29udHJpYnV0aW9uDQotRXh0ZW5zaW9uUG9pbnQtTmFtZS41ID0gSkVFNSBET00gdmFsaWRhdGlvbiBjb250cmlidXRpb24NCi1jYXRlZ29yeS5uYW1lLjAgPSBKRUU1IERPTSBjb25zdHJhaW50IHByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiZmExOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KLTwhLS0NCi0gICAgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAgIA0KLSAgICBDb250cmlidXRvcnM6DQotICAgICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gLS0+DQotDQotPHBsdWdpbj4NCi0NCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkb21ydW50aW1lcyIgbmFtZT0iJURvbVJ1bnRpbWVzRXh0ZW5zaW9uX05hbWUiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVzLmV4c2QiLz4NCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkb21WYWxpZGF0b3IiIG5hbWU9IiVEb21WYWxpZGF0b3JzRXh0ZW5zaW9uX05hbWUiIHNjaGVtYT0ic2NoZW1hL2RvbVZhbGlkYXRvci5leHNkIi8+DQotICAgICAgDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+DQotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudCIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+DQotICAgCTxwYWNrYWdlIA0KLSAgICAgICB1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIiANCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlIiAvPg0KLSAgCTwvZXh0ZW5zaW9uPg0KLQ0KLQ0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1IiANCi0gICAgICAgICBuYW1lPSIlRXh0ZW5zaW9uUG9pbnQtTmFtZS4zIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuZG9tcnVudGltZXMiPg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24iLz4NCi0gICAgICA8cHJvamVjdF9mYWNldCBpZD0ianN0LmVqYiIgdmVyc2lvbj0iMy4wIi8+DQotICAgICAgPHByb2plY3RfZmFjZXQgaWQ9ImpzdC53ZWIiIHZlcnNpb249IjIuNSIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0iZG9tIg0KLSAgICAgICAgIG5hbWU9IiVFeHRlbnNpb25Qb2ludC1OYW1lLjUiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5kb21WYWxpZGF0b3IiPg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSmF4V3NEb21WYWxpZGF0b3IiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi0gICA8IS0tIHt7eyBFTUYgdmFsaWRhdGlvbiBjb250cmlidXRpb24gLS0+DQotDQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5jb25zdHJhaW50UHJvdmlkZXJzIj4NCi0gICAgICA8Y2F0ZWdvcnkNCi0gICAgICAgICAgICBuYW1lPSIlY2F0ZWdvcnkubmFtZS4wIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUiLz4NCi0gICAgICA8Y29uc3RyYWludFByb3ZpZGVyIA0KLSAgICAgIAkJY2FjaGU9InRydWUiIA0KLSAgICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLldzRHluYW1pY01vZGVsQ29uc3RyYWludFByb3ZpZGVyIj4NCi0gICAgICAJPHBhY2thZ2UgbmFtZXNwYWNlVXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUiLz4NCi0gICAgICA8L2NvbnN0cmFpbnRQcm92aWRlcj4gDQotICAgPC9leHRlbnNpb24+DQotCTxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uY29uc3RyYWludEJpbmRpbmdzIj4NCi0gICAgICA8Y2xpZW50Q29udGV4dA0KLSAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUuZG9tQ29udGV4dCI+DQotICAgICAgICAgPGVuYWJsZW1lbnQ+DQotICAgICAgICAgICAgPG9yPg0KLSAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mDQotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSI+DQotICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPg0KLSAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mDQotICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UiPg0KLSAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4NCi0gICAgICAgICAgICAgICA8aW5zdGFuY2VvZg0KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QiPg0KLSAgICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4NCi0gICAgICAgICAgICAgICA8aW5zdGFuY2VvZg0KLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSI+DQotICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPiAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDwvb3I+DQotICAgICAgICAgPC9lbmFibGVtZW50Pg0KLSAgICAgIDwvY2xpZW50Q29udGV4dD4NCi0gICAgICA8YmluZGluZw0KLSAgICAgICAgICAgIGNvbnRleHQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uamVlNS5kb21Db250ZXh0Ig0KLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi52YWxpZGF0aW9uTGlzdGVuZXJzIj4NCi0gICAgICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Xc1Byb2JsZW1zUmVwb3J0ZXIiPg0KLSAgICAgICAgICAgPGNsaWVudENvbnRleHQgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uamVlNS5kb21Db250ZXh0Ii8+DQotICAgICAgIDwvbGlzdGVuZXI+DQotICAgPC9leHRlbnNpb24+DQotICAgPCEtLSB9fX0gRU1GIHZhbGlkYXRpb24gY29udHJpYnV0aW9uIC0tPiAgDQotICAgDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc2NoZW1hL2RvbVZhbGlkYXRvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc2NoZW1hL2RvbVZhbGlkYXRvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzU0MzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NjaGVtYS9kb21WYWxpZGF0b3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiIGlkPSJjb25zdW1lcnR5cGUiIG5hbWU9IkNvbnN1bWVyIFR5cGUgUHJvdmlkZXIiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IGZvciByZWdpc3RlcmluZyBET00gdmFsaWRhdG9yIGZhY3RvcnkgdGhhdCB3aWxsIGluc3RhbnRpYXRlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJpbXBsZW1lbnRhdGlvbiI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgRGVzY3JpYmVzIGEgY29uc3VtZXJ0eXBlDQotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5JRG9tVmFsaWRhdG9yIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zY2hlbWEvcnVudGltZXMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NjaGVtYS9ydW50aW1lcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTNlYjI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NjaGVtYS9ydW50aW1lcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSIgaWQ9InN1cHBvcnRlZHJ1bnRpbWVzIiBuYW1lPSJTdXBwb3J0ZWQgUnVudGltZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVXNlIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHRvIGFkZCBzdXBwb3J0IGZvciBhIHJ1bnRpbWUgaW4gdGhlIFdTIERPTSBUcmVlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2plY3RfZmFjZXQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJpbXBsZW1lbnRhdGlvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9qZWN0X2ZhY2V0Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvRG9tVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9Eb21VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3ZDE4Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9Eb21VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tU3dpdGNoOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBEb21VdGlsDQotew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvbVV0aWwgSU5TVEFOQ0UgPSBuZXcgRG9tVXRpbCgpOw0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBEb21Td2l0Y2g8U3RyaW5nPiBpbXBsU3dpdGNoOw0KLQkNCi0JcHVibGljIERvbVV0aWwoKSB7DQotCQlpbXBsU3dpdGNoID0gY3JlYXRlSW1wbEZpbmRlclN3aXRjaCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlVmFsdWUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIGludCBmZWF0dXJlSWQsIGZpbmFsIE9iamVjdCB2YWx1ZSkNCi0Jew0KLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmVJZCk7DQotCQlvYmplY3QuZVNldChmZWF0dXJlLCB2YWx1ZSk7DQotCX0NCi0NCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlVmFsdWUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIGludCBmZWF0dXJlSWQpDQotCXsNCi0JCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gb2JqZWN0LmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlSWQpOw0KLQkJcmV0dXJuIG9iamVjdC5lR2V0KGZlYXR1cmUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGFkZFRvQ29sbGVjdGlvbkZlYXR1cmUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIGludCBmZWF0dXJlSWQsIGZpbmFsIE9iamVjdCB2YWx1ZSkNCi0Jew0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCQlmaW5hbCBDb2xsZWN0aW9uPE9iamVjdD4gb2xkVmFsdWUgPSAoQ29sbGVjdGlvbjxPYmplY3Q+KSBnZXRGZWF0dXJlVmFsdWUob2JqZWN0LCBmZWF0dXJlSWQpOw0KLQkJb2xkVmFsdWUuYWRkKHZhbHVlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVdlYlNlcnZpY2VQcm9qZWN0IGZpbmRQcm9qZWN0QnlOYW1lKElET00gZG9tLCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJZm9yIChJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0IDogZG9tLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpKQ0KLQkJew0KLQkJCWlmICh3c1Byb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIElXZWJTZXJ2aWNlIGZpbmRXc0J5SW1wbE5hbWUoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgU3RyaW5nIG5hbWUpDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkNCi0JCXsNCi0JCQlpZiAod3MuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gd3M7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZmluZFNlaUJ5SW1wbE5hbWUoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgU3RyaW5nIG5hbWUpDQotCXsNCi0JCWZvciAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgOiB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpKQ0KLQkJew0KLQkJCWlmIChzZWkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gc2VpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkNCi0JcHVibGljIElXZWJNZXRob2QgZmluZFdlYk1ldGhvZEJ5SW1wbChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgU3RyaW5nIGltcGwpDQotCXsNCi0JCWZvciAoSVdlYk1ldGhvZCB3bSA6IHNlaS5nZXRXZWJNZXRob2RzKCkpDQotCQl7DQotCQkJaWYgKHdtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGwpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdtOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgSU1ldGhvZCBmaW5kTWV0aG9kKGZpbmFsIElUeXBlIHNlaVR5cGUsIGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiBzZWlUeXBlLmdldE1ldGhvZHMoKSkgDQotCQl7DQotCQkJaWYgKHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSkpIHsNCi0JCQkJcmV0dXJuIG1ldGhvZDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9CQ0KLQ0KLQlwdWJsaWMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudCBmaW5kSmF2YVdlYlNlcnZpY2VFbGVtQnlJbXBsTmFtZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3NCeUltcGxOYW1lKHdzUHJvamVjdCwgbmFtZSk7DQotCQlyZXR1cm4gd3MgPT0gbnVsbCA/IGZpbmRTZWlCeUltcGxOYW1lKHdzUHJvamVjdCwgbmFtZSkgOiB3czsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGN1bGF0ZXMgdGhlIG1ldGhvZCBzaWduYXR1cmUgdG8gYmUgdXNlZCBhcyBpbXBsZW1lbnRhdGlvbiBpbiB7QGxpbmsgSVdlYk1ldGhvZH0NCi0JICogQHBhcmFtIG1ldGhvZA0KLQkgKiBAcmV0dXJuIGNhbGN1bGF0ZWQgc3RyaW5nDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNJbXBsZW1lbnRhdGlvbihmaW5hbCBJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7CQkNCi0JCXJldHVybiBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSArIG1ldGhvZC5nZXRTaWduYXR1cmUoKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEV4dHJhY3Qge0BsaW5rIElXZWJTZXJ2aWNlUHJvamVjdH0gb3V0IG9mIERPTSBvYmplY3QgYnkgcmVjdXJzaXZlbHkNCi0JICogaXRlcmF0aW5nIHBhcmVudCBvYmplY3RzLg0KLQkgKiBAcGFyYW0gZU9iamVjdA0KLQkgKiBAcmV0dXJuIHRoZSBmb3VuZCBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2Ugbm90IGZvdW5kDQotCSAqLw0KLQlwdWJsaWMgSVdlYlNlcnZpY2VQcm9qZWN0IGZpbmRXc1Byb2plY3QoRU9iamVjdCBlT2JqZWN0KQ0KLQl7DQotCQlFT2JqZWN0IHBhcmVudCA9IGVPYmplY3Q7DQotCQl3aGlsZSAocGFyZW50IT1udWxsKSANCi0JCXsNCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSB7DQotCQkJCXJldHVybiAoSVdlYlNlcnZpY2VQcm9qZWN0KXBhcmVudDsNCi0JCQl9DQotCQkJDQotCQkJcGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JCQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgaWYgdGhpcyBTRUkgaXMgcGFydCBvZiBvdXRzaWRlLWluIHdlYiBzZXJ2aWNlDQotCSAqIEBwYXJhbSBzZWkNCi0JICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgd2ViIHNlcnZpY2Ugd2l0aCB3c2RsTG9jYXRpb24gc2V0IHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNPdXRzaWRlSW5XZWJTZXJ2aWNlKGZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKQ0KLQl7DQotCQlpZiAoc2VpID09IG51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA6IHNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKSB7DQotCQkJaWYgKHdlYlNlcnZpY2UuZ2V0V3NkbExvY2F0aW9uKCkhPW51bGwpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0JDQotCQ0KLQkvKioNCi0JICogQ2FsY3VsYXRlcyB1bmlxdWUgaW1wbGVtZW50YXRpb24gZm9yIERPTSBvYmplY3QgaW4gdGhlIHNjb3BlIG9mIHRoZSByZXNvdXJjZSBpbiB3aGljaA0KLQkgKiB0aGV5IGV4aXN0LiBVc2VmdWwgd2hlbiB5b3UgbmVlZCB0byB1bmlxdWVseSBpZGVudGlmeSBET00gb2JqZWN0LiANCi0JICogDQotCSAqIEBwYXJhbSBlT2JqZWN0DQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCBpbXBsZW1lbnRhdGlvbg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjYWxjVW5pcXVlSW1wbChmaW5hbCBFT2JqZWN0IGVPYmplY3QpDQotCXsNCi0JCWlmIChlT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IERvbVBhY2thZ2UuSVdFQl9QQVJBTSkgDQotCQl7DQotCQkJZmluYWwgSVdlYlBhcmFtIHdwID0gKElXZWJQYXJhbSkgZU9iamVjdDsNCi0JCQlyZXR1cm4gKChJV2ViTWV0aG9kKXdwLmVDb250YWluZXIoKSkuZ2V0SW1wbGVtZW50YXRpb24oKSArICJbIiArIHdwLmdldEltcGxlbWVudGF0aW9uKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZXh0cmFjdEltcGxlbWVudGF0aW9uKGVPYmplY3QpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRXh0cmFjdHMgdGhlIGltcGxlbWVudGF0aW9uIHByb3BlcnR5IGZvciBET00gb2JqZWN0IHdpdGhvdXQgY2FzdGluZyA6LUQuDQotCSAqDQotCSAqIEBwYXJhbSBlT2JqZWN0DQotCSAqIEByZXR1cm4gdGhlIGltcGxlbWVudGF0aW9uIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBleHRyYWN0SW1wbGVtZW50YXRpb24oZmluYWwgRU9iamVjdCBlT2JqZWN0KSB7DQotCQlyZXR1cm4gaW1wbFN3aXRjaC5kb1N3aXRjaChlT2JqZWN0KTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBEb21Td2l0Y2g8U3RyaW5nPiBjcmVhdGVJbXBsRmluZGVyU3dpdGNoKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBEb21Td2l0Y2g8U3RyaW5nPigpDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIFN0cmluZyBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugd3MpIHsNCi0JCQkJcmV0dXJuIHdzLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpIHsNCi0JCQkJcmV0dXJuIHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViTWV0aG9kKElXZWJNZXRob2Qgd20pIHsNCi0JCQkJcmV0dXJuIHdtLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQkNCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIHdwKSB7DQotCQkJCXJldHVybiB3cC5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViU2VydmljZVByb2plY3QoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCkgew0KLQkJCQlyZXR1cm4gd3NQcm9qZWN0LmdldE5hbWUoKTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvR2VuZXJhbFR5cGVzTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvR2VuZXJhbFR5cGVzTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGM0YmRiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0dlbmVyYWxUeXBlc05hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi0vKioNCi0gKiBDbGFzcyBjb250YWluaW5nIGNvbnN0YXRucyB3aXRoIG5hbWVzIG9mIHNvbWUgZ2VuZXJhbCB0eXBlcyB1c2VkIG9mdGVuIGluIHZhbGlkYXRpb24uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqIA0KLSAqLw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJhbFR5cGVzTmFtZXMNCi17DQotCS8qKiBqYXZhLmxhbmcuT2JqZWN0ICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTEFOR19PQkpFQ1QgPSAiamF2YS5sYW5nLk9iamVjdCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqIGphdmEuaW8uU2VyaWFsaXphYmxlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfSU9fU0VSSUFMSVpBQkxFID0gImphdmEuaW8uU2VyaWFsaXphYmxlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS5ybWkuUmVtb3RlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfUk1JX1JFTU9URSA9ICJqYXZhLnJtaS5SZW1vdGUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiBqYXZhLmxhbmcuVGhyb3dhYmxlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTEFOR19USFJPV0FCTEUgPSAiamF2YS5sYW5nLlRocm93YWJsZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqIGphdmEubGFuZy5FeGNlcHRpb24gKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9MQU5HX0VYQ0VQVElPTiA9ICJqYXZhLmxhbmcuRXhjZXB0aW9uIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS5sYW5nLkNsb25lYWJsZSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xBTkdfQ0xPTkVBQkxFID0gImphdmEubGFuZy5DbG9uZWFibGUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiBqYXZhLmxhbmcuQ29tcGFyYWJsZSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xBTkdfQ09NUEFSQUJMRSA9ICJqYXZhLmxhbmcuQ29tcGFyYWJsZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqIGphdmEudXRpbC5NYXAgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9VVElMX01BUCA9ICJqYXZhLnV0aWwuTWFwIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS51dGlsLkNvbGxlY3Rpb24gKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9VVElMX0NPTExFQ1RJT04gPSAiamF2YS51dGlsLkNvbGxlY3Rpb24iOyAvLyROT04tTkxTLTEkDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSU5hbWVkRXh0ZW5zaW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlNTA5YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aWcgYW5kIGV4dGVudGlvbi4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lZEV4dGVuc2lvbkluZm8NCi17DQotDQotCS8qKg0KLQkgKiBUaGUgdW5pcXVlIElEIHRvIGlkZW50aWZ5IHRoaXMgY29uc3VtZXIgdHlwZSB3aGVuIGNhbGxpbmcgdGhlIDxjb2RlPlByb3h5R2VuZXJhdG9yRmFjdG9yeTwvY29kZT4sIGUuZy4gPGNvZGU+amVlL2pheHdzPC9jb2RlPg0KLQkgKiANCi0JICogQHJldHVybiBub24tZW1wdHkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIElEDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElkKCk7DQotDQotCS8qKg0KLQkgKiBBIHZlcmJvc2UgbmFtZSBmb3IgdGhlIHR5cGUgb2YgY29uc3VtZXIsIGUuZy4gPGNvZGU+SkFYLVdTPC9jb2RlPg0KLQkgKiANCi0JICogQHJldHVybiBsb2NhbGl6ZWQgc3RyaW5nIHVzZWQgZm9yIHRoZSBVSQ0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNiY2QxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eURlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3IgRE9NIG9iamVjdCdzIHByb3BlcnRpZXMuDQotICogVXN1YWxseSB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgdXNlZCBieSBjbGllbnRzIHRoYXQgbmVlZCB0byByZXZlcnQgc29tZQ0KLSAqIHByb3BlcnR5IHZhbHVlIHRvIHRoZSBkZWZhdWx0IG9uZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJUHJvcGVydHlEZWZhdWx0cyANCi17DQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIDxjb2RlPmZlYXR1cmU8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUgcmVwcmVzZW50aW5nIHRoZSBvYmplY3RzIHByb3BlcnR5IHR5cGUNCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4gSW4gY2FzZSA8Y29kZT5udWxsPC9jb2RlPiBpcyBwb3NzaWJsZSBwcm9wZXJ0eSB2YWx1ZQ0KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBtaWdodCBiZSByZXR1cm5lZA0KLQkgKi8NCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGM0ZTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5U3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgY2hlY2tpbmcgdGhlIHN0YXRlIG9mIHNvbWUgcHJvcGVydHkgZm9yIGNvbmNyZXRlIERPTSBvYmplY3QuDQotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIHVzZWQgYnkgRE9NIGNsaWVudHMgdGhhdCBuZWVkIHRvIGtub3cgaWYgc29tZSBwcm9wZXJ0eSANCi0gKiBjYW4gYmUgY2hhbmdlZCAtIGZvciBleGFtcGxlIFVJIGVkaXRvciB0aGF0IG5lZWRzIHRvIGtub3cgaWYgdGhlIHByb3BlcnR5IHNob3VsZA0KLSAqIGJlIGVuYWJsZWQgZm9yIGVkaXQgb3IgZGlzYWJsZWQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5U3RhdGUgDQotew0KLQkvKioNCi0JICogRGVmaW5lcyBpZiBwcm9wZXJ0eSBpcyBjaGFuZ2VhYmxlLg0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgcHJvcGVydHkgY2FuIGJlIGNoYW5nZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlYWJsZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvUHJpbWl0aXZlVHlwZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvUHJpbWl0aXZlVHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTUxMjdiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1ByaW1pdGl2ZVR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgY2xhc3MgdXNlZCBmb3Igc29tZSBnZW5lcmFsIHByaW1pdGl2ZSB0eXBlIGNoZWNrcy9vcGVyYXRpb25zLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKiANCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlVHlwZUhhbmRsZXINCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlJBWV9NQVJLID0gIltdIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRCA9ICJ2b2lkIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByaW1pdGl2ZVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotCXN0YXRpYw0KLQl7DQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImJvb2xlYW4iLCAiamF2YS5sYW5nLkJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5Cb29sZWFuIiwgImphdmEubGFuZy5Cb29sZWFuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJieXRlIiwgImphdmEubGFuZy5CeXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuQnl0ZSIsICJqYXZhLmxhbmcuQnl0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiY2hhciIsICJqYXZhLmxhbmcuQ2hhcmFjdGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuQ2hhcmFjdGVyIiwgImphdmEubGFuZy5DaGFyYWN0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImRvdWJsZSIsICJqYXZhLmxhbmcuRG91YmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuRG91YmxlIiwgImphdmEubGFuZy5Eb3VibGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImZsb2F0IiwgImphdmEubGFuZy5GbG9hdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiamF2YS5sYW5nLkZsb2F0IiwgImphdmEubGFuZy5GbG9hdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiaW50IiwgImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuSW50ZWdlciIsICJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiamF2YS5sYW5nLlN0cmluZyIsICJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJsb25nIiwgImphdmEubGFuZy5Mb25nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuTG9uZyIsICJqYXZhLmxhbmcuTG9uZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgic2hvcnQiLCAiamF2YS5sYW5nLlNob3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuU2hvcnQiLCAiamF2YS5sYW5nLlNob3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgdHlwZSBmb3IgcHJpbWl0aXZlIHR5cGUuIE1hcHBpbmcgYmV0d2VlbiB0eXBlczoNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICAmcXVvdDtib29sZWFuLCAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLkJvb2xlYW4mcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5Cb29sZWFuJnF1b3Q7LCAgICZxdW90O2phdmEubGFuZy5Cb29sZWFuJnF1b3Q7DQotCSAqICAmcXVvdDtieXRlJnF1b3Q7LCAgICAgICAgICAgICAgICAmcXVvdDtqYXZhLmxhbmcuQnl0ZSZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkJ5dGUmcXVvdDssICAgICAgJnF1b3Q7amF2YS5sYW5nLkJ5dGUmcXVvdDsNCi0JICogICZxdW90O2NoYXImcXVvdDssICAgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5DaGFyYWN0ZXImcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5DaGFyYWN0ZXImcXVvdDssICZxdW90O2phdmEubGFuZy5DaGFyYWN0ZXImcXVvdDsNCi0JICogICZxdW90O2RvdWJsZSZxdW90OywgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5Eb3VibGUmcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5Eb3VibGUmcXVvdDssICAgICZxdW90O2phdmEubGFuZy5Eb3VibGUmcXVvdDsNCi0JICogICZxdW90O2Zsb2F0JnF1b3Q7LCAgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5GbG9hdCZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkZsb2F0JnF1b3Q7LCAgICAgJnF1b3Q7amF2YS5sYW5nLkZsb2F0JnF1b3Q7DQotCSAqICAmcXVvdDtpbnQmcXVvdDssICAgICAgICAgICAgICAgICAmcXVvdDtqYXZhLmxhbmcuSW50ZWdlciZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkludGVnZXImcXVvdDssICAgJnF1b3Q7amF2YS5sYW5nLkludGVnZXImcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5TdHJpbmcmcXVvdDssICAgICZxdW90O2phdmEubGFuZy5TdHJpbmcmcXVvdDsNCi0JICogICZxdW90O2xvbmcmcXVvdDssICAgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5Mb25nJnF1b3Q7DQotCSAqICAmcXVvdDtqYXZhLmxhbmcuTG9uZyZxdW90OywgICAgICAmcXVvdDtqYXZhLmxhbmcuTG9uZyZxdW90Ow0KLQkgKiAgJnF1b3Q7c2hvcnQmcXVvdDssICAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLlNob3J0JnF1b3Q7DQotCSAqICAmcXVvdDtqYXZhLmxhbmcuU2hvcnQmcXVvdDssICAgICAmcXVvdDtqYXZhLmxhbmcuU2hvcnQmcXVvdDsNCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHJldHVybiB3cmFwcGVyIGNsYXNzIG5hbWUgZm9yIDx0dD50eXBlTmFtZTwvdHQ+Lg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZUZvclByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gcHJpbWl0aXZlVHlwZXMuZ2V0KHR5cGVOYW1lKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyBqYXZhIHByaW1pdGl2ZSB0eXBlLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gKHByaW1pdGl2ZVR5cGVzLmdldCh0eXBlTmFtZSkgIT0gbnVsbCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyBpZiB0aGUgPHR0PnR5cGVOYW1lPC90dD4gcmVwcmVzZW50cyBhbiBhcnJheSB0eXBlLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyBhcnJheSB0eXBlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcnJheVR5cGUoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gdHlwZU5hbWUudHJpbSgpLmVuZHNXaXRoKEFSUkFZX01BUkspOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgPHR0PnR5cGVOYW1lPC90dD4gaXMgdm9pZC4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcmV0dXJuIHRydWUgaWYgPHR0PnR5cGVOYW1lPC90dD4gaXMgdm9pZC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZvaWRUeXBlKFN0cmluZyB0eXBlTmFtZSkNCi0Jew0KLQkJcmV0dXJuIHR5cGVOYW1lLnRyaW0oKS5lcXVhbHMoVk9JRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0aGUgcmVhbCB0eXBlIG5hbWUgZnJvbSBhcnJheSB0eXBlLiBFeGFtcGxlOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogICBGb3IgdHlwZSAnaW50W10nIHJldHVybnMgJ2ludCcNCi0JICogICBGb3IgdHlwZSAnU3RyaW5nW11bXScgcmV0dXJucyAnU3RyaW5nJw0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcmV0dXJuIHJlYWwgdHlwZSBuYW1lDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlRnJvbUFycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCVN0cmluZyBuYW1lID0gdHlwZU5hbWUudHJpbSgpLnJlcGxhY2VBbGwoIiAiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJd2hpbGUgKG5hbWUuZW5kc1dpdGgoQVJSQVlfTUFSSykpDQotCQl7DQotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSBBUlJBWV9NQVJLLmxlbmd0aCgpKTsNCi0JCX0NCi0NCi0JCXJldHVybiBuYW1lOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvVHlwZVJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1R5cGVSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjQxOGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvVHlwZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyBjb250YWluaW5nIGxvZ2ljIGZvciByZXNvbHZpbmcgdHlwZSBuYW1lcyBmcm9tIElUeXBlIG9iamVjdC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFR5cGVSZXNvbHZlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVEUgPSAiPyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFJlc29sdmVzIDx0dD50eXBlTmFtZTwvdHQ+IHVzaW5nIDx0dD50eXBlPC90dD4uIEluIGNhc2Ugd2hlbiA8dHQ+dHlwZU5hbWU8L3R0PiBjb250YWlucyBnZW5lcmljcyBkZWNsYXJhdGlvbiBhbGwgdHlwZXMgdXNlZCBpbg0KLQkgKiBkZWNsYXJhaW9uIGFyZSByZXR1cm5lZC4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAcmV0dXJuIGxpc3Qgb2YgcmVzb2x2ZWQgdHlwZXMNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHJlc29sdmVUeXBlcyhTdHJpbmcgdHlwZU5hbWUsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEpOw0KLQkJU3RyaW5nIHJlYWxUeXBlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyh0eXBlTmFtZSk7DQotDQotCQlpZiAoaGFzR2VuZXJpY3MocmVhbFR5cGVOYW1lKSkNCi0JCXsNCi0JCQluYW1lcyA9IGdldFR5cGVzRnJvbUdlbmVyaWNzKHJlYWxUeXBlTmFtZSwgdHlwZSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQluYW1lcy5hZGQocmVhbFR5cGVOYW1lKTsNCi0JCX0NCi0NCi0JCUxpc3Q8U3RyaW5nPiByZXNvbHZlZE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KG5hbWVzLnNpemUoKSk7DQotCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpDQotCQl7DQotCQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IHJlc29sdmVUeXBlKG5hbWUsIHR5cGUpOw0KLQ0KLQkJCWlmICghcmVzb2x2ZWROYW1lLmVxdWFscyhRVU9URSkpDQotCQkJew0KLQkJCQlyZXNvbHZlZE5hbWVzLmFkZChyZXNvbHZlZE5hbWUpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiByZXNvbHZlZE5hbWVzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgcmVhbCB0eXBlIGluIGNhc2UgdHlwZSBpcyBwcmVzZW50IGJ5IGdlbmVyaWNzLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlDQotCSAqIEByZXR1cm4gdGhlIHJlYWwgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyBhbiBleHByZXNzaW9uIG90aGVyd2lzZSA8dHQ+dHlwZU5hbWU8L3R0Pg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGUoU3RyaW5nIHR5cGVOYW1lLCBJVHlwZSBkZWNsYXJpbmdUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICh0eXBlTmFtZS5pbmRleE9mKCc/JykgPiAtMSkNCi0JCXsNCi0JCQlpbnQgcG9zID0gdHlwZU5hbWUudHJpbSgpLmxhc3RJbmRleE9mKCcgJyk7DQotCQkJaWYgKHBvcyA+IC0xKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZSh0eXBlTmFtZS5zdWJzdHJpbmcocG9zICsgMSksIGRlY2xhcmluZ1R5cGUpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiB0eXBlTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0cyB0aGUgdHlwZXMgdXNlZCBpbiBnZW5lcmljcyBkZWNsYXJhdGlvbi4NCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGNvbnRhaW5pbmcgcmVzb2x2ZWQgdHlwZQ0KLQkgKiBAcmV0dXJuIGxpc3Qgb2YgdHlwZSBuYW1lcy4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRUeXBlc0Zyb21HZW5lcmljcyhTdHJpbmcgdHlwZU5hbWUsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIG5hbWUgPSB0eXBlTmFtZTsJCQkNCi0JCUxpc3Q8U3RyaW5nPiBuYW1lcz0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotCQkNCi0JCWludCBsdFBvcyA9IC0xOwkJDQotCQlpbnQgZ3RQb3MgPSAtMTsNCi0JCXdoaWxlICgobHRQb3MgPSBuYW1lLmluZGV4T2YoJzwnKSkgPiAtMSkNCi0JCXsJCQkNCi0JCQlpZiAoKGd0UG9zID0gbmFtZS5sYXN0SW5kZXhPZignPicpKSA9PSAtMSkNCi0JCQl7DQotCQkJCWd0UG9zID0gbmFtZS5sZW5ndGgoKS0yOw0KLQkJCX0NCi0JCQkNCi0JCQlTdHJpbmcgZmlyc3ROYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbHRQb3MpICsgbmFtZS5zdWJzdHJpbmcoZ3RQb3MrMSk7DQotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGx0UG9zKzEsIGd0UG9zKTsNCi0JCQkNCi0JCQlhZGROYW1lKGZpcnN0TmFtZSwgbmFtZXMsIHR5cGUpOw0KLQkJCWlmIChuYW1lLmluZGV4T2YoJzwnKSA9PSAtMSkgDQotCQkJew0KLQkJCQlhZGROYW1lKG5hbWUsIG5hbWVzLCB0eXBlKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBuYW1lczsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBhZGROYW1lKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXMsIGZpbmFsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaW50IGNvbWFQb3MgPSBuYW1lLmluZGV4T2YoJywnKTsNCi0JCWlmKCBjb21hUG9zID4gLTEpDQotCQl7DQotCQkJbmFtZXMuYWRkKG5hbWUuc3Vic3RyaW5nKDAsIGNvbWFQb3MpKTsNCi0JCQluYW1lcy5hZGQobmFtZS5zdWJzdHJpbmcoY29tYVBvcysxKSk7DQotCQl9IA0KLQkJZWxzZSB7DQotCQkJbmFtZXMuYWRkKGdldFR5cGUobmFtZSwgdHlwZSkpOw0KLQkJfQkJDQotCX0NCi0NCi0JLyoqDQotCSAqIFJlc29sdmVzIHR5cGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgdHlwZSBuYW1lLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVR5cGUoZmluYWwgU3RyaW5nIHR5cGVOYW1lLCBmaW5hbCBJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyByZWFsVHlwZU5hbWUgPSB0eXBlTmFtZTsNCi0JCWlmIChQcmltaXRpdmVUeXBlSGFuZGxlci5pc0FycmF5VHlwZSh0eXBlTmFtZSkpDQotCQl7DQotCQkJcmV0dXJuIHJlc29sdmVUeXBlKFByaW1pdGl2ZVR5cGVIYW5kbGVyLmdldFR5cGVGcm9tQXJyYXlUeXBlKHR5cGVOYW1lKSwgdHlwZSk7DQotCQl9DQotDQotCQlpZiAoUHJpbWl0aXZlVHlwZUhhbmRsZXIuaXNKYXZhUHJpbWl0aXZlVHlwZShyZWFsVHlwZU5hbWUpIHx8IFByaW1pdGl2ZVR5cGVIYW5kbGVyLmlzVm9pZFR5cGUocmVhbFR5cGVOYW1lKSkNCi0JCXsNCi0JCQlyZXR1cm4gcmVhbFR5cGVOYW1lOw0KLQkJfQ0KLQ0KLQkJaWYgKHJlYWxUeXBlTmFtZS5pbmRleE9mKERPVCkgPiAtMSkNCi0JCXsNCi0JCQlyZXR1cm4gcmVhbFR5cGVOYW1lOw0KLQkJfQ0KLQ0KLQkJU3RyaW5nW11bXSBzdCA9IHR5cGUucmVzb2x2ZVR5cGUocmVhbFR5cGVOYW1lKTsNCi0JCWlmIChzdCAhPSBudWxsKQ0KLQkJew0KLQkJCWlmIChzdFswXVswXS5sZW5ndGgoKSA9PSAwKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHN0WzBdWzFdOw0KLQkJCX0NCi0NCi0JCQlyZXR1cm4gc3RbMF1bMF0gKyBET1QgKyBzdFswXVsxXTsNCi0JCX0NCi0NCi0JCWlmIChyZWFsVHlwZU5hbWUuc3RhcnRzV2l0aChuZXcgU3RyaW5nKG5ldyBjaGFyW10geyBTaWduYXR1cmUuQ19VTlJFU09MVkVEIH0pKSkNCi0JCXsNCi0JCQlyZXR1cm4gcmVzb2x2ZVR5cGUocmVhbFR5cGVOYW1lLnN1YnN0cmluZygxLCByZWFsVHlwZU5hbWUubGVuZ3RoKCkpLCB0eXBlKTsNCi0JCX0NCi0NCi0JCXJldHVybiByZWFsVHlwZU5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPnR5cGVOYW1lPC9jb2RlPiB1c2VzIGdlbmVyaWNzIGRlY2xhcmF0aW9uLiBFeGFtcGxlOiBmb3IgJ2phdmEudXRpbC5MaXN0PFN0cm5nPicgdGhlIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gdHJ1ZSBpcyA8dHQ+dHlwZU5hbWU8L3R0PiBjb250YWlucyBnZW5lcmljcyBkZWNsYXJhdGlvbi4NCi0JICovDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzR2VuZXJpY3MoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gKHR5cGVOYW1lLmluZGV4T2YoJzwnKSA+IC0xKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1dzRG9tU3RhcnR1cFBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1dzRG9tU3RhcnR1cFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhMjEwMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01SdW50aW1lTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7DQotDQotLyoqDQotICogU3RhcnR1cCBwYXJ0aWNpcGFudCByZWdpc3RlcmVkIG9uIElERSBzdGFydHVwIGV4dGVuc2lvbiBwb2ludA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV3NEb21TdGFydHVwUGFydGljaXBhbnQgaW1wbGVtZW50cyBJU3RhcnR1cCANCi17DQotCQ0KLQkvKioNCi0JICogQ2FsbGVkIGJ5IHRoZSBFY2xpcHNlIG9uIHdvcmtiZW5jaCBzdGFydHVwLg0KLQkgKiBTdGFydHMgbG9hZCBmb3IgcmVnaXN0ZXJlZCB3ZWIgc2VydmljZSBydW50aW1lcyANCi0JICovDQotICAgIHB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpDQotICAgIHsNCi0JCUpvYiBqb2IgPSBuZXcgSm9iKEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLldzRG9tU3RhcnR1cFBhcnRpY2lwYW50X1N0YXJ0dXBfSm9iX01lc3NhZ2UpDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQl7DQotCQkgICAgCVdzRE9NUnVudGltZU1hbmFnZXIuaW5zdGFuY2UoKS5jcmVhdGVET01SdW50aW1lcyhtb25pdG9yKTsNCi0JCSAgICAJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJam9iLnNldFVzZXIoZmFsc2UpOw0KLQkJam9iLnNldFByaW9yaXR5KEpvYi5MT05HKTsNCi0JCWpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQkJam9iLnNjaGVkdWxlKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTg3NjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLg0KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgRG9tRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsNCi0JLyoqDQotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlEb21GYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbUZhY3RvcnlJbXBsLmluaXQoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SURPTTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SURPTTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSURPTSBjcmVhdGVJRE9NKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUlKYXZhV2ViU2VydmljZUVsZW1lbnQgY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIE1ldGhvZDwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYk1ldGhvZCBjcmVhdGVJV2ViTWV0aG9kKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgUGFyYW08L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgUGFyYW08L2VtPicuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUlXZWJQYXJhbSBjcmVhdGVJV2ViUGFyYW0oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUlXZWJTZXJ2aWNlIGNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYlNlcnZpY2VQcm9qZWN0IGNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFR5cGU8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgVHlwZTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYlR5cGUgY3JlYXRlSVdlYlR5cGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRG9tUGFja2FnZSBnZXREb21QYWNrYWdlKCk7DQotDQotfSAvL0RvbUZhY3RvcnkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2YWFiMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4NCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50DQotICogPHVsPg0KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4NCi0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPg0KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPg0KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+DQotICogPC91bD4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeQ0KLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIERvbVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7DQotCS8qKg0KLQkgKiBUaGUgcGFja2FnZSBuYW1lLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU3RyaW5nIGVOQU1FID0gImRvbSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlEb21QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsLmluaXQoKTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSURPTUltcGwgPGVtPklET008L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElET00oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSURPTSA9IDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JRE9NPC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElET01fRkVBVFVSRV9DT1VOVCA9IDE7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIDxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQgPSAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04gPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FID0gMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IDI7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsIDxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gMjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5UQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdDwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGluZyBXZWIgU2VydmljZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUyA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3Ow0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCA8ZW0+SVdlYiBNZXRob2Q8L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJNZXRob2QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0QgPSAzOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX0lNUExFTUVOVEFUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT047DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9fUEFSQU1FVEVSUyA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9fRVhDTFVERUQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIE1ldGhvZDwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9GRUFUVVJFX0NPVU5UID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlBhcmFtSW1wbCA8ZW0+SVdlYiBQYXJhbTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVdFQl9QQVJBTSA9IDQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19JTVBMRU1FTlRBVElPTiA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9QQVJBTV9fS0lORCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9QQVJBTV9fVFlQRV9OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19QQVJUX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19IRUFERVIgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgUGFyYW08L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9QQVJBTV9GRUFUVVJFX0NPVU5UID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsIDxlbT5JV2ViIFNlcnZpY2U8L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJV2ViU2VydmljZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0UgPSA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX19JTVBMRU1FTlRBVElPTiA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fUE9SVF9OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsIDxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX1BST0pFQ1QgPSA2Ow0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUyA9IDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTID0gMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUgPSAyOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9QUk9KRUNUX0ZFQVRVUkVfQ09VTlQgPSAzOw0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViVHlwZUltcGwgPGVtPklXZWIgVHlwZTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJUeXBlSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJUeXBlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IElXRUJfVFlQRSA9IDc7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1RZUEVfX0lNUExFTUVOVEFUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT047DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfVFlQRV9fTkFNRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU7DQotDQotCS8qKg0KLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBUeXBlPC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfVFlQRV9GRUFUVVJFX0NPVU5UID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQgPGVtPldlYiBQYXJhbSBLaW5kPC9lbT59JyBlbnVtLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFdlYlBhcmFtS2luZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBXRUJfUEFSQU1fS0lORCA9IDg7DQotDQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFNPQVBfQklORElOR19TVFlMRSA9IDk7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UgPGVtPlNPQVAgQmluZGluZyBVc2U8L2VtPn0nIGVudW0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBTT0FQX0JJTkRJTkdfVVNFID0gMTA7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScgZW51bS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gMTE7DQotDQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00gPGVtPklET008L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SURPTTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElET00oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00jZ2V0V2ViU2VydmljZVByb2plY3RzIDxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NI2dldFdlYlNlcnZpY2VQcm9qZWN0cygpDQotCSAqIEBzZWUgI2dldElET00oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElET01fV2ViU2VydmljZVByb2plY3RzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQgPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50I2dldEltcGxlbWVudGF0aW9uIDxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGxlbWVudGF0aW9uPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCNnZXRJbXBsZW1lbnRhdGlvbigpDQotCSAqIEBzZWUgI2dldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb24oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCNnZXROYW1lKCkNCi0JICogQHNlZSAjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNpc0ltcGxpY2l0IDxlbT5JbXBsaWNpdDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkltcGxpY2l0PC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNpc0ltcGxpY2l0KCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsaWNpdCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyA8ZW0+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRVJlZmVyZW5jZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFdlYk1ldGhvZHMgPGVtPldlYiBNZXRob2RzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgTWV0aG9kczwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0V2ViTWV0aG9kcygpDQotCSAqIEBzZWUgI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFNvYXBCaW5kaW5nU3R5bGUgPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBzZWUgI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdVc2UgPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBzZWUgI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QgPGVtPklXZWIgTWV0aG9kPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SVdlYk1ldGhvZCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRQYXJhbWV0ZXJzIDxlbT5QYXJhbWV0ZXJzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QYXJhbWV0ZXJzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRQYXJhbWV0ZXJzKCkNCi0JICogQHNlZSAjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SVdlYk1ldGhvZF9QYXJhbWV0ZXJzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNpc0V4Y2x1ZGVkIDxlbT5FeGNsdWRlZDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGVkPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNpc0V4Y2x1ZGVkKCkNCi0JICogQHNlZSAjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9FeGNsdWRlZCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQHNlZSAjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nVXNlKCkNCi0JICogQHNlZSAjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtIDxlbT5JV2ViIFBhcmFtPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgUGFyYW08L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElXZWJQYXJhbSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2luZDwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRLaW5kKCkNCi0JICogQHNlZSAjZ2V0SVdlYlBhcmFtKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fS2luZCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRUeXBlTmFtZSA8ZW0+VHlwZSBOYW1lPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZSBOYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldFR5cGVOYW1lKCkNCi0JICogQHNlZSAjZ2V0SVdlYlBhcmFtKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fVHlwZU5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0UGFydE5hbWUgPGVtPlBhcnQgTmFtZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcnQgTmFtZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRQYXJ0TmFtZSgpDQotCSAqIEBzZWUgI2dldElXZWJQYXJhbSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQHNlZSAjZ2V0SVdlYlBhcmFtKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2lzSGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IZWFkZXI8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jaXNIZWFkZXIoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9IZWFkZXIoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UgPGVtPklXZWIgU2VydmljZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SVdlYlNlcnZpY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRTZXJ2aWNlRW5kcG9pbnQgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0U2VydmljZUVuZHBvaW50KCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlX1NlcnZpY2VFbmRwb2ludCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcnQgTmFtZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFBvcnROYW1lKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1BvcnROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0V3NkbExvY2F0aW9uIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBzZWUgI2dldElXZWJTZXJ2aWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZV9Xc2RsTG9jYXRpb24oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0IDxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QjZ2V0V2ViU2VydmljZXMgPGVtPldlYiBTZXJ2aWNlczwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2ViIFNlcnZpY2VzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldFdlYlNlcnZpY2VzKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRVJlZmVyZW5jZSBnZXRJV2ViU2VydmljZVByb2plY3RfV2ViU2VydmljZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRVJlZmVyZW5jZSBnZXRJV2ViU2VydmljZVByb2plY3RfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXROYW1lKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZSA8ZW0+SVdlYiBUeXBlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgVHlwZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViVHlwZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZCA8ZW0+V2ViIFBhcmFtIEtpbmQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5XZWIgUGFyYW0gS2luZDwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFRW51bSBnZXRXZWJQYXJhbUtpbmQoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlIDxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFNPQVBCaW5kaW5nU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSA8ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNPQVAgQmluZGluZyBVc2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFRW51bSBnZXRTT0FQQmluZGluZ1VzZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFRW51bSBnZXRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlEb21GYWN0b3J5IGdldERvbUZhY3RvcnkoKTsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQNCi0JICogPHVsPg0KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+DQotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPg0KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KLQkgKiA8L3VsPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50ZXJmYWNlIExpdGVyYWxzIHsNCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklET01JbXBsIDxlbT5JRE9NPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSURPTUltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SURPTSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJRE9NID0gZUlOU1RBTkNFLmdldElET00oKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlIFByb2plY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTID0gZUlOU1RBTkNFLmdldElET01fV2ViU2VydmljZVByb2plY3RzKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCA8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9JbXBsZW1lbnRhdGlvbigpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSA9IGVJTlNUQU5DRS5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X05hbWUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsIDxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBsaWNpdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCA9IGVJTlNUQU5DRS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxpY2l0KCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUyA9IGVJTlNUQU5DRS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRVJlZmVyZW5jZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kcygpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfVGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSA9IGVJTlNUQU5DRS5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsIDxlbT5JV2ViIE1ldGhvZDwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJNZXRob2QoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSVdFQl9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRVJlZmVyZW5jZSBJV0VCX01FVEhPRF9fUEFSQU1FVEVSUyA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX1BhcmFtZXRlcnMoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX01FVEhPRF9fRVhDTFVERUQgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZF9FeGNsdWRlZCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFID0gZUlOU1RBTkNFLmdldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsIDxlbT5JV2ViIFBhcmFtPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlBhcmFtSW1wbA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJV2ViUGFyYW0oKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSVdFQl9QQVJBTSA9IGVJTlNUQU5DRS5nZXRJV2ViUGFyYW0oKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfUEFSQU1fX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX0tpbmQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9QQVJBTV9fVFlQRV9OQU1FID0gZUlOU1RBTkNFLmdldElXZWJQYXJhbV9UeXBlTmFtZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1BBUkFNX19QQVJUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFID0gZUlOU1RBTkNFLmdldElXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9QQVJBTV9fSEVBREVSID0gZUlOU1RBTkNFLmdldElXZWJQYXJhbV9IZWFkZXIoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbCA8ZW0+SVdlYiBTZXJ2aWNlPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJTZXJ2aWNlKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElXRUJfU0VSVklDRSA9IGVJTlNUQU5DRS5nZXRJV2ViU2VydmljZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlX1NlcnZpY2VFbmRwb2ludCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlX1RhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRJV2ViU2VydmljZV9Qb3J0TmFtZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCA8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJTZXJ2aWNlUHJvamVjdCgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJV0VCX1NFUlZJQ0VfUFJPSkVDVCA9IGVJTlNUQU5DRS5nZXRJV2ViU2VydmljZVByb2plY3QoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBTZXJ2aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRVJlZmVyZW5jZSBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlUHJvamVjdF9OYW1lKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViVHlwZUltcGwgPGVtPklXZWIgVHlwZTwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJUeXBlSW1wbA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJV2ViVHlwZSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJV0VCX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SVdlYlR5cGUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kIDxlbT5XZWIgUGFyYW0gS2luZDwvZW0+fScgZW51bS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0V2ViUGFyYW1LaW5kKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUVudW0gV0VCX1BBUkFNX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0V2ViUGFyYW1LaW5kKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUgPGVtPlNPQVAgQmluZGluZyBTdHlsZTwvZW0+fScgZW51bS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nU3R5bGUoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFRW51bSBTT0FQX0JJTkRJTkdfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSA8ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+fScgZW51bS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZ1VzZSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVFbnVtIFNPQVBfQklORElOR19VU0UgPSBlSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdVc2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScgZW51bS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFRW51bSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gZUlOU1RBTkNFLmdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JfQ0KLQ0KLX0gLy9Eb21QYWNrYWdlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTRhODhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lET00uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklET008L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqDQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NI2dldFdlYlNlcnZpY2VQcm9qZWN0cyA8ZW0+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SURPTSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSURPTSBleHRlbmRzIEVPYmplY3Qgew0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3R9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElET01fV2ViU2VydmljZVByb2plY3RzKCkNCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUxpc3Q8SVdlYlNlcnZpY2VQcm9qZWN0PiBnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0NCi19IC8vIElET00NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxMjAwZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi0NCi0vKioNCi0gKiBAbW9kZWwNCi0gKiAgKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGV4dGVuZHMgRU9iamVjdA0KLXsNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb24oKTsNCi0NCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2dldE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNTg5ZDExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi0NCi0NCi0vKioNCi0gKiBAbW9kZWwNCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLXsNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXQoKTsNCi0NCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIGNvbnRhaW5tZW50PSJmYWxzZSIgbWFueT0idHJ1ZSIgdHlwZT0iSVdlYlNlcnZpY2UiIG9wcG9zaXRlPSJzZXJ2aWNlRW5kcG9pbnQiDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZT4gZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0JDQotCS8qKg0KLQkgKiBAbW9kZWwgY2hhbmdlYWJsZT0idHJ1ZSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgbWFueT0idHJ1ZSIgdHlwZT0iSVdlYk1ldGhvZCINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJNZXRob2Q+IGdldFdlYk1ldGhvZHMoKTsNCi0JDQotCS8qKg0KLQkgKiBAbW9kZWwgY2hhbmdlYWJsZT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkRPQ1VNRU5UIjwvY29kZT4uDQotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCSAqIEBzZWUgI3NldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQG1vZGVsIGRlZmF1bHQ9IkRPQ1VNRU5UIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU09BUEJpbmRpbmdTdHlsZSBnZXRTb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZQ0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iTElURVJBTCI8L2NvZGU+Lg0KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UNCi0JICogQHNlZSAjc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iTElURVJBTCIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVNPQVBCaW5kaW5nVXNlIGdldFNvYXBCaW5kaW5nVXNlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdVc2UgPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2UNCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IldSQVBQRUQiPC9jb2RlPi4NCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQ0KLQkgKiBAc2VlICNzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJXUkFQUEVEIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSB2YWx1ZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV1NET01SdW50aW1lTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTM5Y2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi0NCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElXU0RPTVJ1bnRpbWVNYW5hZ2VyDQotew0KLQkvKioNCi0JICogSW5zdGFudGlhdGVzIHRoZSBET00gUnVudGltZXMgaWYgbm90IGFscmVhZHkuDQotCSAqIEBwYXJhbSBwcm9ncmVzcyBtb25pdG9yIHRvIHRyYWNrIHByb2dyZXNzIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgY3JlYXRlRE9NUnVudGltZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsNCi0JDQotCS8qKg0KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW50aW1lIGlkDQotCSAqIGFuZCBpbnN0YW50aWF0ZSBzdWNoIERPTSBydW50aW1lIGluc3RhbmNlIGlmIG5vbiBleGlzdGVudCBhdCB0aGUgDQotCSAqIG1vbWVudCBvZiBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kLg0KLQkgKiANCi0JICogQHBhcmFtIHJ1bnRpbWVJZCAtIHN0cmluZyBpZGVudGlmaWVyIG9mIHRoZSBydW50aW1lIA0KLQkgKiBAcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZS4gTnVsbCBpZiBydW50aW1lIHdpdGggc3VjaCBpZCBpcyBub3QgcmVnaXN0ZXJlZA0KLQkgKi8NCi0JcHVibGljICBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERPTVJ1bnRpbWUoU3RyaW5nIHJ1bnRpbWVJZCk7DQotCQ0KLQkvKioNCi0JICogDQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBET00gUnVudGltZXMgY3VycmVudGx5IGluc3RhbnRpYXRlZA0KLQkgKi8NCi0JcHVibGljIENvbGxlY3Rpb248SVdzRE9NUnVudGltZUV4dGVuc2lvbj4gZ2V0RE9NUnVudGltZXMoKTsNCi0NCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZWxvYWQgYWxsIGluc3RhbmNlcyBvZiBET00gUnVudGltZXMuDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZWxvYWRET01SdW50aW1lcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3MGQzODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYk1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViTWV0aG9kIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLXsNCi0JLyoqDQotCSAqIEBtb2RlbCB0eXBlPSJJV2ViUGFyYW0iIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiBtYW55PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCUVMaXN0PElXZWJQYXJhbT4gZ2V0UGFyYW1ldGVycygpOw0KLQkNCi0JLyoqDQotCSAqIEBtb2RlbCB0eXBlPSJib29sZWFuIiBtYW55PSJmYWxzZSIgY2hhbmdlYWJsZT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqLw0KLQlib29sZWFuIGlzRXhjbHVkZWQoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNpc0V4Y2x1ZGVkIDxlbT5FeGNsdWRlZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZWQ8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNpc0V4Y2x1ZGVkKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRFeGNsdWRlZChib29sZWFuIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iRE9DVU1FTlQiPC9jb2RlPi4NCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQHNlZSAjc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iRE9DVU1FTlQiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1N0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMSVRFUkFMIjwvY29kZT4uDQotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2V9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlICNzZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMSVRFUkFMIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU09BUEJpbmRpbmdVc2UgZ2V0U29hcEJpbmRpbmdVc2UoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iV1JBUFBFRCI8L2NvZGU+Lg0KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGV9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBzZWUgI3NldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQG1vZGVsIGRlZmF1bHQ9IldSQVBQRUQiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlBhcmFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjc2OTZlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotDQotLyoqDQotICogDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKg0KLSAqIEBtb2RlbA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlBhcmFtIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLXsNCi0JLyoqDQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgbWFueT0iZmFsc2UiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIg0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlTdHJpbmcgZ2V0VHlwZU5hbWUoKTsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjc2V0UGFydE5hbWUoU3RyaW5nKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViUGFyYW1fUGFydE5hbWUoKQ0KLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVN0cmluZyBnZXRQYXJ0TmFtZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0UGFydE5hbWUgPGVtPlBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0UGFydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFBhcnROYW1lKFN0cmluZyB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVhZGVyPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjc2V0SGVhZGVyKGJvb2xlYW4pDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElXZWJQYXJhbV9IZWFkZXIoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlib29sZWFuIGlzSGVhZGVyKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNpc0hlYWRlciA8ZW0+SGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWFkZXI8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNpc0hlYWRlcigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0SGVhZGVyKGJvb2xlYW4gdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9IldlYlBhcmFtS2luZCIgcmVxdWlyZWQ9InRydWUiIG1hbnk9ImZhbHNlIg0KLQkgKi8NCi0JV2ViUGFyYW1LaW5kIGdldEtpbmQoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kDQotCSAqIEBzZWUgI2dldEtpbmQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldEtpbmQoV2ViUGFyYW1LaW5kIHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwMTFmZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi0NCi0vKioNCi0gKiBAbW9kZWwNCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZSBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnQgDQotew0KLQkvKioNCi0JICogQG1vZGVsIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiBvcHBvc2l0ZT0iaW1wbGVtZW50aW5nV2ViU2VydmljZXMiIHR5cGU9IklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpOw0KLQkNCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFBvcnROYW1lKFN0cmluZyB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBAbW9kZWwgY2hhbmdlYWJsZT0idHJ1ZSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxMb2NhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZVByb2plY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDFkNWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVByb2plY3QgZXh0ZW5kcyBFT2JqZWN0DQotew0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9IklXZWJTZXJ2aWNlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgbWFueT0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZT4gZ2V0V2ViU2VydmljZXMoKTsNCi0JDQotCQ0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9IklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiBtYW55PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCk7DQotCQ0KLQkvKioNCi0JICogQG1vZGVsIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzM0ZGE5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViVHlwZSAgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IHsNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjJiODA1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NET01SdW50aW1lRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgcnVudGltZSB3aGljaCB3YW50IHRvIGhhdmUgRE9NIFRyZWUgDQotICogcmVwcmVzZW50YXRpb24gb24gdG9wIG9mIHRoZW0uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgSHJpc3RvdiBJMDM2MjAxDQotICovDQotcHVibGljIGludGVyZmFjZSBJV3NET01SdW50aW1lRXh0ZW5zaW9uIA0KLXsNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBpbnN0YW50aWF0ZSB0aGUgRE9NIGluc3RhbmNlIGZvciB0aGUgcnVudGltZSBhbmQgbG9hZHMgdGhlDQotCSAqIGRhdGEgaW50byBpdC4gVGhlIG1ldGhvZCBsb2NrcyB0aGUgd29ya3NwYWNlIHJvb3QgZHVyaW5nIGV4ZWN1dGlvbi4gSWYgeW91IGNhbGwgdGhpcw0KLQkgKiBtZXRob2QgZHVyaW5nIGxvYWRpbmcgKGkuZS4gc29tZWJvZHkgYWxyZWFkeSBjYWxsZWQgaXQgaW4gZGlmZmVyZW50IHRocmVhZCkgdGhlIG1ldGhvZCANCi0JICogd2lsbCBibG9jayB1bnRpbCB0aGUgbG9hZCBmaW5pc2hlcyBpbnN0ZWFkIG9mIHRyaWdnZXJpbmcgRE9NIHJlbG9hZC4gDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yIHRvIGJlIHVzZWQgZHVyaW5nIGxvYWRpbmcsIGNhbmNlbGxpbmcgdGhlIGxvYWQgdmlhIG1vbml0b3IgaXMgc3VwcG9ydGVkDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaW4gY2FzZSB0aGUgRE9NIGxvYWRpbmcgaXMgbm90IGFibGUgdG8gcmVhZCByZXF1aXJlZCBkYXRhDQotCSAqIEB0aHJvd3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gaW4gY2FzZSB0aGUgbG9hZGluZyB3YXMgY2FuY2VsbGVkIHZpYSBwcm92aWRlZCANCi0JICogPGNvZGU+bW9uaXRvcjwvY29kZT4uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVET00oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLQkNCi0JLyoqDQotCSAqIEFkZHMgYSBsb2FkIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIGluIGxvYWQgZXZlbnRzLiBJbiBjYXNlIHRoZSBsb2FkaW5nIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCANCi0JICogdGhpcyBsaXN0ZW5lcidzIG1ldGhvZHMgYXJlIGNhbGxlZCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxvYWQuDQotCSAqIHtAbGluayBJV3NEb21Mb2FkTGlzdGVuZXIjZmluaXNoZWQoKX0gbWV0aG9kIGlzIGNhbGxlZCBpbiBhbnkgY2FzZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgbG9hZGluZw0KLQkgKiBoYXMgYmVlbiBjYW5jZWxsZWQgb3Igbm90LiANCi0JICogQHBhcmFtIGxpc3RlbmVyDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRMb2FkTGlzdGVuZXIoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyKTsNCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIERPTSBsb2FkaW5nIGxpc3RlbmVycyBsaXN0DQotCSAqIA0KLQkgKiBAcGFyYW0gbGlzdGVuZXINCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUxvYWRMaXN0ZW5lcihJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIpOw0KLQkNCi0JLyoqDQotCSAqIFRvIGdldCBhIGhhbmRsZSB0byB0aGUgRE9NIGluc3RhbmNlIGF2YWlsYWJsZSBmb3IgdGhpcyBydW50aW1lLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgRE9NIGluc3RhbmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGxvYWRpbmcgd2FzIG5vdCBzdGFydGVkIHlldCBvcg0KLQkgKiBpcyBub3QgZmluaXNoZWQgeWV0Lg0KLQkgKiBAdGhyb3dzIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGluIGNhc2UgbG9hZGluZyBoYXMgYmVlbiBjYWxsZWQgYWxyZWFkeSBidXQgdGhlIGxvYWQNCi0JICogaGFzIGJlZW4gY2FuY2VsbGVkDQotCSAqLw0KLQlwdWJsaWMgSURPTSBnZXRET00oKSB0aHJvd3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RvbUxvYWRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3OWIwNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotDQotDQotLyoqDQotICogSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IGludGVyZXN0ZWQgaW4gRE9NIGxvYWQgcHJvY2Vzcy4gSW1wbGVtZW50b3JzIGNhbiBiZSBhZGRlZCB0bw0KLSAqIHRoZSB7QGxpbmsgSVdzRE9NUnVudGltZUV4dGVuc2lvbn0gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIG9uIGxvYWQgc3RhcnR1cC9maW5pc2ggIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXc0RvbUxvYWRMaXN0ZW5lciANCi17DQotCS8qKg0KLQkgKiBDYWxsZWQgYnkge0BsaW5rIElXc0RPTVJ1bnRpbWVFeHRlbnNpb259IGp1c3QgYmVmb3JlIHRoZSBET00gbG9hZCBzdGFydCANCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0ZWQoKTsNCi0JDQotCS8qKg0KLQkgKiBDYWxsZWQgYnkge0BsaW5rIElXc0RPTVJ1bnRpbWVFeHRlbnNpb259IHdoZW4gdGhlIERPTSBsb2FkIGhhcyBmaW5pc2hlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgZmluaXNoZWQoKTsJDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU2ODU1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nLA0KLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLSAqIEBtb2RlbA0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgZW51bSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGltcGxlbWVudHMgRW51bWVyYXRvciB7DQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5XUkFQUEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI1dSQVBQRURfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JV1JBUFBFRCgwLCAiV1JBUFBFRCIsICJXUkFQUEVEIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+QkFSRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNCQVJFX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCUJBUkUoMSwgIkJBUkUiLCAiQkFSRSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPldSQVBQRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPldSQVBQRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI1dSQVBQRUQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdSQVBQRURfVkFMVUUgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+QkFSRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QkFSRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjQkFSRQ0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFSRV9WQUxVRSA9IDE7DQotDQotCS8qKg0KLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlW10gVkFMVUVTX0FSUkFZID0NCi0JCW5ldyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlW10NCi0JCXsNCi0JCQlXUkFQUEVELA0KLQkJCUJBUkUsDQotCQl9Ow0KLQ0KLQkvKioNCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsNCi0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0KGludCB2YWx1ZSkgew0KLQkJc3dpdGNoICh2YWx1ZSkNCi0JCXsNCi0JCQljYXNlIFdSQVBQRURfVkFMVUU6IHJldHVybiBXUkFQUEVEOw0KLQkJCWNhc2UgQkFSRV9WQUxVRTogcmV0dXJuIEJBUkU7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsNCi0NCi0JLyoqDQotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgew0KLQkgIHJldHVybiB2YWx1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCi0JICByZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0JDQotfSAvL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwODIyNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdTdHlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nLA0KLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldFNPQVBCaW5kaW5nU3R5bGUoKQ0KLSAqIEBtb2RlbA0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgZW51bSBTT0FQQmluZGluZ1N0eWxlIGltcGxlbWVudHMgRW51bWVyYXRvciB7DQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5ET0NVTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNET0NVTUVOVF9WQUxVRQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlET0NVTUVOVCgwLCAiRE9DVU1FTlQiLCAiRE9DVU1FTlQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5SUEM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjUlBDX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCVJQQygxLCAiUlBDIiwgIlJQQyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ET0NVTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjRE9DVU1FTlQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPQ1VNRU5UX1ZBTFVFID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPlJQQzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UlBDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNSUEMNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJQQ19WQUxVRSA9IDE7DQotDQotCS8qKg0KLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nU3R5bGVbXSBWQUxVRVNfQVJSQVkgPQ0KLQkJbmV3IFNPQVBCaW5kaW5nU3R5bGVbXQ0KLQkJew0KLQkJCURPQ1VNRU5ULA0KLQkJCVJQQywNCi0JCX07DQotDQotCS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTT0FQQmluZGluZ1N0eWxlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdTdHlsZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVNPQVBCaW5kaW5nU3R5bGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdTdHlsZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVNPQVBCaW5kaW5nU3R5bGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1N0eWxlIGdldChpbnQgdmFsdWUpIHsNCi0JCXN3aXRjaCAodmFsdWUpDQotCQl7DQotCQkJY2FzZSBET0NVTUVOVF9WQUxVRTogcmV0dXJuIERPQ1VNRU5UOw0KLQkJCWNhc2UgUlBDX1ZBTFVFOiByZXR1cm4gUlBDOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7DQotDQotCS8qKg0KLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIFNPQVBCaW5kaW5nU3R5bGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JCXRoaXMubmFtZSA9IG5hbWU7DQotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsNCi0JICByZXR1cm4gdmFsdWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCSAgcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7DQotCSAgcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9DQotCQ0KLX0gLy9TT0FQQmluZGluZ1N0eWxlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nVXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzNWIxODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicsDQotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0U09BUEJpbmRpbmdVc2UoKQ0KLSAqIEBtb2RlbA0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgZW51bSBTT0FQQmluZGluZ1VzZSBpbXBsZW1lbnRzIEVudW1lcmF0b3Igew0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+TElURVJBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNMSVRFUkFMX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCUxJVEVSQUwoMCwgIkxJVEVSQUwiLCAiTElURVJBTCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkVOQ09ERUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjRU5DT0RFRF9WQUxVRQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlFTkNPREVEKDEsICJFTkNPREVEIiwgIkVOQ09ERUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5MSVRFUkFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5MSVRFUkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNMSVRFUkFMDQotCSAqIEBtb2RlbA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVRFUkFMX1ZBTFVFID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkVOQ09ERUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVOQ09ERUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0VOQ09ERUQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ERURfVkFMVUUgPSAxOw0KLQ0KLQkvKioNCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdVc2VbXSBWQUxVRVNfQVJSQVkgPQ0KLQkJbmV3IFNPQVBCaW5kaW5nVXNlW10NCi0JCXsNCi0JCQlMSVRFUkFMLA0KLQkJCUVOQ09ERUQsDQotCQl9Ow0KLQ0KLQkvKioNCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFNPQVBCaW5kaW5nVXNlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nVXNlIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdVc2UgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlNPQVAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nVXNlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdVc2UgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdVc2UgZ2V0KGludCB2YWx1ZSkgew0KLQkJc3dpdGNoICh2YWx1ZSkNCi0JCXsNCi0JCQljYXNlIExJVEVSQUxfVkFMVUU6IHJldHVybiBMSVRFUkFMOw0KLQkJCWNhc2UgRU5DT0RFRF9WQUxVRTogcmV0dXJuIEVOQ09ERUQ7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsNCi0NCi0JLyoqDQotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgU09BUEJpbmRpbmdVc2UoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JCXRoaXMubmFtZSA9IG5hbWU7DQotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsNCi0JICByZXR1cm4gdmFsdWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCSAgcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7DQotCSAgcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9DQotCQ0KLX0gLy9TT0FQQmluZGluZ1VzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dlYlBhcmFtS2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5MjY0M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsNCi0NCi0vKioNCi0gKiBAbW9kZWwNCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGVudW0gV2ViUGFyYW1LaW5kIGltcGxlbWVudHMgRW51bWVyYXRvciB7LyoqQG1vZGVsKi9JTigwLCAiSU4iLCAiSU4iKSwgLyoqQG1vZGVsKi9JTk9VVCgxLCAiSU5PVVQiLCAiSU5PVVQiKSwgLyoqQG1vZGVsKi9PVVQoMiwgIk9VVCIsICJPVVQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQNCi0NCi0vKioNCi0JICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNJTg0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fVkFMVUUgPSAwOw0KLS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0lOT1VUDQotCSAqIEBtb2RlbA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTk9VVF9WQUxVRSA9IDE7DQotLyoqDQotCSAqIFRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNPVVQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9WQUxVRSA9IDI7DQotLyoqDQotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5XZWIgUGFyYW0gS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWJQYXJhbUtpbmRbXSBWQUxVRVNfQVJSQVkgPQ0KLQkJbmV3IFdlYlBhcmFtS2luZFtdDQotCQl7DQotCQkJSU4sDQotCQkJSU5PVVQsDQotCQkJT1VULA0KLQkJfTsNCi0vKioNCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxXZWJQYXJhbUtpbmQ+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCi0NCi0vKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5XZWIgUGFyYW0gS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgV2ViUGFyYW1LaW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJV2ViUGFyYW1LaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsNCi0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBXZWJQYXJhbUtpbmQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlXZWJQYXJhbUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0vKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5XZWIgUGFyYW0gS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgV2ViUGFyYW1LaW5kIGdldChpbnQgdmFsdWUpIHsNCi0JCXN3aXRjaCAodmFsdWUpDQotCQl7DQotCQkJY2FzZSBJTl9WQUxVRTogcmV0dXJuIElOOw0KLQkJCWNhc2UgSU5PVVRfVkFMVUU6IHJldHVybiBJTk9VVDsNCi0JCQljYXNlIE9VVF9WQUxVRTogcmV0dXJuIE9VVDsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsNCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOw0KLQ0KLS8qKg0KLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIFdlYlBhcmFtS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQotCX0NCi0NCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7DQotCSAgcmV0dXJuIHZhbHVlOw0KLQl9DQotDQotLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCSAgcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCi0JICByZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlyZXR1cm4gbGl0ZXJhbDsNCi0JfX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjcxMDQ3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB0aHJvd24gaW4gY2FzZSB0aGUgbG9hZGluZyBvZiBXUyBET00gaGFzIGJlZW4gY2FuY2VsbGVkDQotICogIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgZXhjZXB0aW9uIHdpdGggYWJpbGl0eSB0byBwcm92aWRlIGxvY2FsaXplZCBtZXNzYWdlDQotCSAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIGRldGFpbCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlIC0gdGhlIGxvY2FsaXplZCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAtIGluIGNhc2UgbG9jYWxpc2VkIG1lc3NhZ2UgaXMgbnVsbA0KLQkgKiAqLw0KLQlwdWJsaWMgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKSB7DQotCQlzdXBlcihtZXNzYWdlKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShsb2NhbGl6ZWRNZXNzYWdlLCAibG9jYWxpemVkTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLmxvY2FsaXplZE1lc3NhZ2UgPSBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyBsb2NhbGl6ZWQgbWVzc2FnZSB3aXRoIHdoaWNoIHRoZSBleGNlcHRpb24gd2FzIGNvbnN0cnVjdGVkLiovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7DQotCQlyZXR1cm4gbG9jYWxpemVkTWVzc2FnZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2ZDRhNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV3NET01SdW50aW1lTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LklXc0RPTVJ1bnRpbWVJbmZvOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuV3NET01SdW50aW1lUmVnaXN0cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IGNsYXNzIGZvciBpbnN0YW50aWF0aW5nIERPTSBSdW50aW1lcyBhbmQgbWFuYWdpbmcgdGhvc2UgaW5zdGFuY2VzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIEhyaXN0b3YNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RPTVJ1bnRpbWVNYW5hZ2VyIGltcGxlbWVudHMgSVdTRE9NUnVudGltZU1hbmFnZXINCi17DQotCXByaXZhdGUgc3RhdGljIFdzRE9NUnVudGltZU1hbmFnZXIgaW5zdGFuY2UgPSBuZXcgV3NET01SdW50aW1lTWFuYWdlcigpOw0KLQ0KLQlwcml2YXRlIE1hcDxTdHJpbmcsSVdzRE9NUnVudGltZUV4dGVuc2lvbj4gZG9tUnVudGltZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSVdzRE9NUnVudGltZUV4dGVuc2lvbj4oKTsNCi0NCi0JcHJvdGVjdGVkIFdzRE9NUnVudGltZU1hbmFnZXIoKQ0KLQl7DQotCQkvLyBzaW5nbGV0b24NCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyBJV1NET01SdW50aW1lTWFuYWdlciBpbnN0YW5jZSgpDQotCXsNCi0JCXJldHVybiBpbnN0YW5jZTsNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBJbnN0YW50aWF0ZXMgdGhlIERPTSBSdW50aW1lcyBpZiBub3QgYWxyZWFkeS4NCi0JICoNCi0JICovDQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjcmVhdGVET01SdW50aW1lcyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCWZvciAoSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8gOiBXc0RPTVJ1bnRpbWVSZWdpc3RyeS5nZXRSZWdpc3RlcmVkUnVudGltZXNJbmZvKCkpIHsNCi0JCQljcmVhdGVET01SdW50aW1lKHJ1bnRpbWVJbmZvLCBtb25pdG9yKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gY3JlYXRlRE9NUnVudGltZShmaW5hbCBJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQl7DQotCQlmaW5hbCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGRvbVJ1bnRpbWUgPSBnZXRET01SdW50aW1lKHJ1bnRpbWVJbmZvKTsJCQ0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQl0cnkgew0KLQkJCWRvbVJ1bnRpbWUuY3JlYXRlRE9NKG1vbml0b3IpOw0KLQkJfSANCi0JCWNhdGNoIChFeGNlcHRpb24gdW5leHBlY3RlZCkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiEgRG9tIGZyb20gcnVudGltZSAiICsgcnVudGltZUluZm8uZ2V0TmFtZSgpICsgIiB3aWxsIG5vdCBiZSBwcm9jZXNzZWQhIiwgdW5leHBlY3RlZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZG9tUnVudGltZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlc2NyaXB0b3Igb2JqZWN0DQotCSAqIG9mIHR5cGUgSVJ1bnRpbWVJbmZvIGFuZCBpbnN0YW50aWF0ZSBzdWNoIERPTSBydW50aW1lIGluc3RhbmNlIGlmIG5vbiBleGlzdGVudCBhdCB0aGUgDQotCSAqIG1vbWVudCBvZiBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kLg0KLQkgKiANCi0JICogQHBhcmFtIHJ1bnRpbWVJbmZvIC0gZGVzY3JpcHRvciBvZiB0aGUgRE9NIHJ1bnRpbWUgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCByZXR1cm5lZCANCi0JICogQHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERPTVJ1bnRpbWUoZmluYWwgSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8pDQotCXsNCi0JCWlmIChydW50aW1lSW5mbyA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IGRvbVJ1bnRpbWVzLmdldChydW50aW1lSW5mby5nZXRJZCgpKTsJCQ0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQlkb21SdW50aW1lID0gV3NET01SdW50aW1lUmVnaXN0cnkuaW5zdGFudGlhdGVSdW50aW1lKHJ1bnRpbWVJbmZvKTsNCi0JCQlpZiAoZG9tUnVudGltZSAhPSBudWxsKSB7DQotCQkJCXN5bmNocm9uaXplZChkb21SdW50aW1lcykgew0KLQkJCQkJZG9tUnVudGltZXMucHV0KHJ1bnRpbWVJbmZvLmdldElkKCksIGRvbVJ1bnRpbWUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZG9tUnVudGltZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bnRpbWUgaWQNCi0JICogYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSANCi0JICogbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUlkIC0gc3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIHJ1bnRpbWUgDQotCSAqIEByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBnZXRET01SdW50aW1lKGZpbmFsIFN0cmluZyBydW50aW1lSWQpDQotCXsNCi0JCXJldHVybiBnZXRET01SdW50aW1lKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKHJ1bnRpbWVJZCkpOw0KLQl9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBpbnN0YW50aWF0ZWQgRE9NIFJ1bnRpbWVzDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lRXh0ZW5zaW9uPiBnZXRET01SdW50aW1lcygpDQotICAgIHsNCi0gICAgCWlmIChkb21SdW50aW1lcy5zaXplKCkgPT0gMCkgDQotICAgIAl7DQotCSAgICAJZmluYWwgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gcnRJbmZvcyA9IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKTsNCi0JICAgIAlmb3IgKElXc0RPTVJ1bnRpbWVJbmZvIHJ1bnRpbWVJbmZvIDogcnRJbmZvcykgew0KLQkJCQlnZXRET01SdW50aW1lKHJ1bnRpbWVJbmZvKTsNCi0JCQl9DQotICAgIAl9DQotICAgIAkNCi0gICAgCXJldHVybiBkb21SdW50aW1lcy52YWx1ZXMoKTsNCi0gICAgfQ0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZWxvYWQgYWxsIGluc3RhbmNlcyBvZiBET00gUnVudGltZXMuDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsb2FkRE9NUnVudGltZXMoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQl7DQotCQlzeW5jaHJvbml6ZWQoZG9tUnVudGltZXMpIHsNCi0JCQlkb21SdW50aW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJV3NET01SdW50aW1lRXh0ZW5zaW9uPigpOw0KLQkJfQ0KLQkJDQotCQljcmVhdGVET01SdW50aW1lcyhtb25pdG9yKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyKCkgew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDQxZWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImRvbSIKLSAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJRE9NIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViU2VydmljZVByb2plY3RzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0lXZWJTZXJ2aWNlUHJvamVjdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBsZW1lbnRhdGlvbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBsaWNpdCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9JV2ViU2VydmljZSIgZU9wcG9zaXRlPSIjLy9JV2ViU2VydmljZS9zZXJ2aWNlRW5kcG9pbnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJNZXRob2RzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lXZWJNZXRob2QiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEJpbmRpbmdTdHlsZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NPQVBCaW5kaW5nU3R5bGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkRPQ1VNRU5UIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBCaW5kaW5nVXNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU09BUEJpbmRpbmdVc2UiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkxJVEVSQUwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IldSQVBQRUQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVdlYk1ldGhvZCIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJhbWV0ZXJzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lXZWJQYXJhbSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVkIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1N0eWxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU09BUEJpbmRpbmdTdHlsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iRE9DVU1FTlQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEJpbmRpbmdVc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TT0FQQmluZGluZ1VzZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iTElURVJBTCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iV1JBUFBFRCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJV2ViUGFyYW0iIGVTdXBlclR5cGVzPSIjLy9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2luZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dlYlBhcmFtS2luZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlTmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcnROYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWFkZXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJV2ViU2VydmljZSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnQiIGVUeXBlPSIjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UvaW1wbGVtZW50aW5nV2ViU2VydmljZXMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9ydE5hbWUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbExvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklXZWJTZXJ2aWNlUHJvamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYlNlcnZpY2VzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0lXZWJTZXJ2aWNlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklXZWJUeXBlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV2ViUGFyYW1LaW5kIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJJTk9VVCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9VVCIgdmFsdWU9IjIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJTT0FQQmluZGluZ1N0eWxlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkRPQ1VNRU5UIiBsaXRlcmFsPSJET0NVTUVOVCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUlBDIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlNPQVBCaW5kaW5nVXNlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxJVEVSQUwiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkVOQ09ERUQiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJXUkFQUEVEIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJCQVJFIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS53cy5nZW5tb2RlbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLndzLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDI2OWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLndzLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSIgbW9kZWxOYW1lPSJEb20iIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uRG9tVWkiCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkubmF2aWdhdG9yLmdlbmVyYXRlZC5Eb21FZGl0b3JQbHVnaW4iCi0gICAgbm9uTkxTTWFya2Vycz0idHJ1ZSIgdGVzdHNEaXJlY3Rvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMiCi0gICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmphdmEiIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIgotICAgIHByb3ZpZGVyUm9vdEV4dGVuZHNDbGFzcz0iIj4KLSAgPGZvcmVpZ25Nb2RlbD5AbW9kZWw8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iRG9tIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlUGFja2FnZVN1ZmZpeD0icnVudGltZS5hcGkiIG1ldGFEYXRhUGFja2FnZVN1ZmZpeD0icnVudGltZS5hcGkiIGNsYXNzUGFja2FnZVN1ZmZpeD0icnVudGltZS5pbnRlcm5hbC5pbXBsIgotICAgICAgdXRpbGl0eVBhY2thZ2VTdWZmaXg9InJ1bnRpbWUudXRpbCIgcHJvdmlkZXJQYWNrYWdlU3VmZml4PSJ1aSIgZ2VuZXJhdGVFeGFtcGxlQ2xhc3M9ImZhbHNlIgotICAgICAgZWNvcmVQYWNrYWdlPSJkb20uZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImRvbS5lY29yZSMvL1dlYlBhcmFtS2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1dlYlBhcmFtS2luZC9JTiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9XZWJQYXJhbUtpbmQvSU5PVVQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vV2ViUGFyYW1LaW5kL09VVCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nU3R5bGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1N0eWxlL0RPQ1VNRU5UIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nU3R5bGUvUlBDIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdVc2UiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1VzZS9MSVRFUkFMIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nVXNlL0VOQ09ERUQiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS9XUkFQUEVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUvQkFSRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSURPTSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lET00vd2ViU2VydmljZVByb2plY3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQvaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JSmF2YVdlYlNlcnZpY2VFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS9pbXBsaWNpdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UvaW1wbGVtZW50aW5nV2ViU2VydmljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS93ZWJNZXRob2RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS90YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3NvYXBCaW5kaW5nU3R5bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3NvYXBCaW5kaW5nVXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lXZWJNZXRob2QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkb20uZWNvcmUjLy9JV2ViTWV0aG9kL3BhcmFtZXRlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViTWV0aG9kL2V4Y2x1ZGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYk1ldGhvZC9zb2FwQmluZGluZ1N0eWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYk1ldGhvZC9zb2FwQmluZGluZ1VzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJNZXRob2Qvc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JV2ViUGFyYW0iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJQYXJhbS9raW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL3R5cGVOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL3BhcnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJQYXJhbS9oZWFkZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlL3NlcnZpY2VFbmRwb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlL3BvcnROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2Uvd3NkbExvY2F0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlUHJvamVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlUHJvamVjdC93ZWJTZXJ2aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkb20uZWNvcmUjLy9JV2ViU2VydmljZVByb2plY3Qvc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlUHJvamVjdC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lXZWJUeXBlIi8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0RvbUZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTFkM2E3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+Lg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBEb21GYWN0b3J5IHsNCi0JLyoqDQotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgRG9tRmFjdG9yeSBpbml0KCkgew0KLQkJdHJ5DQotCQl7DQotCQkJRG9tRmFjdG9yeSB0aGVEb21GYWN0b3J5ID0gKERvbUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS5lY29yZSIpOyAvLyROT04tTkxTLTEkIA0KLQkJCWlmICh0aGVEb21GYWN0b3J5ICE9IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm4gdGhlRG9tRmFjdG9yeTsNCi0JCQl9DQotCQl9DQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikNCi0JCXsNCi0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgRG9tRmFjdG9yeUltcGwoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21GYWN0b3J5SW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsNCi0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JRE9NOiByZXR1cm4gY3JlYXRlSURPTSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UOiByZXR1cm4gY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6IHJldHVybiBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EOiByZXR1cm4gY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOiByZXR1cm4gY3JlYXRlSVdlYlBhcmFtKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRTogcmV0dXJuIGNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUOiByZXR1cm4gY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfVFlQRTogcmV0dXJuIGNyZWF0ZUlXZWJUeXBlKCk7DQotCQkJZGVmYXVsdDoNCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsNCi0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5XRUJfUEFSQU1fS0lORDoNCi0JCQkJcmV0dXJuIGNyZWF0ZVdlYlBhcmFtS2luZEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBjcmVhdGVTT0FQQmluZGluZ1N0eWxlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBjcmVhdGVTT0FQQmluZGluZ1VzZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gY3JlYXRlU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOw0KLQkJCWRlZmF1bHQ6DQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuV0VCX1BBUkFNX0tJTkQ6DQotCQkJCXJldHVybiBjb252ZXJ0V2ViUGFyYW1LaW5kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlyZXR1cm4gY29udmVydFNPQVBCaW5kaW5nU3R5bGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlyZXR1cm4gY29udmVydFNPQVBCaW5kaW5nVXNlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRToNCi0JCQkJcmV0dXJuIGNvbnZlcnRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsNCi0JCQlkZWZhdWx0Og0KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJRE9NIGNyZWF0ZUlET00oKSB7DQotCQlJRE9NSW1wbCBpZG9tID0gbmV3IElET01JbXBsKCk7DQotCQlyZXR1cm4gaWRvbTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGNyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoKSB7DQotCQlJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBpSmF2YVdlYlNlcnZpY2VFbGVtZW50ID0gbmV3IElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsKCk7DQotCQlyZXR1cm4gaUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gbmV3IElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsKCk7DQotCQlyZXR1cm4gaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViTWV0aG9kIGNyZWF0ZUlXZWJNZXRob2QoKSB7DQotCQlJV2ViTWV0aG9kSW1wbCBpV2ViTWV0aG9kID0gbmV3IElXZWJNZXRob2RJbXBsKCk7DQotCQlyZXR1cm4gaVdlYk1ldGhvZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViUGFyYW0gY3JlYXRlSVdlYlBhcmFtKCkgew0KLQkJSVdlYlBhcmFtSW1wbCBpV2ViUGFyYW0gPSBuZXcgSVdlYlBhcmFtSW1wbCgpOw0KLQkJcmV0dXJuIGlXZWJQYXJhbTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViU2VydmljZSBjcmVhdGVJV2ViU2VydmljZSgpIHsNCi0JCUlXZWJTZXJ2aWNlSW1wbCBpV2ViU2VydmljZSA9IG5ldyBJV2ViU2VydmljZUltcGwoKTsNCi0JCXJldHVybiBpV2ViU2VydmljZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViU2VydmljZVByb2plY3QgY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCkgew0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCBpV2ViU2VydmljZVByb2plY3QgPSBuZXcgSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCgpOw0KLQkJcmV0dXJuIGlXZWJTZXJ2aWNlUHJvamVjdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViVHlwZSBjcmVhdGVJV2ViVHlwZSgpIHsNCi0JCUlXZWJUeXBlSW1wbCBpV2ViVHlwZSA9IG5ldyBJV2ViVHlwZUltcGwoKTsNCi0JCXJldHVybiBpV2ViVHlwZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBXZWJQYXJhbUtpbmQgY3JlYXRlV2ViUGFyYW1LaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7DQotCQlXZWJQYXJhbUtpbmQgcmVzdWx0ID0gV2ViUGFyYW1LaW5kLmdldChpbml0aWFsVmFsdWUpOw0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V2ViUGFyYW1LaW5kVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nU3R5bGUgY3JlYXRlU09BUEJpbmRpbmdTdHlsZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KLQkJU09BUEJpbmRpbmdTdHlsZSByZXN1bHQgPSBTT0FQQmluZGluZ1N0eWxlLmdldChpbml0aWFsVmFsdWUpOw0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U09BUEJpbmRpbmdTdHlsZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1VzZSBjcmVhdGVTT0FQQmluZGluZ1VzZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KLQkJU09BUEJpbmRpbmdVc2UgcmVzdWx0ID0gU09BUEJpbmRpbmdVc2UuZ2V0KGluaXRpYWxWYWx1ZSk7DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTT0FQQmluZGluZ1VzZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGNyZWF0ZVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsNCi0JCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgcmVzdWx0ID0gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5nZXQoaW5pdGlhbFZhbHVlKTsNCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgY29udmVydFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgew0KLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tUGFja2FnZSBnZXREb21QYWNrYWdlKCkgew0KLQkJcmV0dXJuIChEb21QYWNrYWdlKWdldEVQYWNrYWdlKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZGVwcmVjYXRlZA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlARGVwcmVjYXRlZA0KLQlwdWJsaWMgc3RhdGljIERvbVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLmVJTlNUQU5DRTsNCi0JfQ0KLQ0KLX0gLy9Eb21GYWN0b3J5SW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9Eb21QYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0RvbVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc5NTg4YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0RvbVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb21QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIERvbVBhY2thZ2Ugew0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlkb21FQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlXZWJNZXRob2RFQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlXZWJQYXJhbUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYlNlcnZpY2VFQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUNsYXNzIGlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYlR5cGVFQ2xhc3MgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUVudW0gd2ViUGFyYW1LaW5kRUVudW0gPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUVudW0gc29hcEJpbmRpbmdTdHlsZUVFbnVtID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIEVFbnVtIHNvYXBCaW5kaW5nVXNlRUVudW0gPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUVudW0gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUVFbnVtID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgNCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UNCi0JICogcGFja2FnZSBVUkkgdmFsdWUuDQotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMNCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMNCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwNCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZU5TX1VSSQ0KLQkgKiBAc2VlICNpbml0KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBEb21QYWNrYWdlSW1wbCgpIHsNCi0JCXN1cGVyKGVOU19VUkksIERvbUZhY3RvcnkuZUlOU1RBTkNFKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcw0KLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQ0KLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbA0KLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMNCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbA0KLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLg0KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoDQotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZA0KLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6DQotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55DQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvDQotCSAqIHRob3NlIG9mIGFub3RoZXIuDQotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUNCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZU5TX1VSSQ0KLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQ0KLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBEb21QYWNrYWdlIGluaXQoKSB7DQotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoRG9tUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEb21QYWNrYWdlLmVOU19VUkkpOw0KLQ0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQ0KLQkJRG9tUGFja2FnZUltcGwgdGhlRG9tUGFja2FnZSA9IChEb21QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBEb21QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IERvbVBhY2thZ2VJbXBsKCkpOw0KLQ0KLQkJaXNJbml0ZWQgPSB0cnVlOw0KLQ0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMNCi0JCXRoZURvbVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7DQotDQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhDQotCQl0aGVEb21QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCi0NCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQNCi0JCXRoZURvbVBhY2thZ2UuZnJlZXplKCk7DQotDQotCQlyZXR1cm4gdGhlRG9tUGFja2FnZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SURPTSgpIHsNCi0JCXJldHVybiBpZG9tRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaWRvbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkgew0KLQkJcmV0dXJuIGlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X0ltcGxlbWVudGF0aW9uKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfTmFtZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpSmF2YVdlYlNlcnZpY2VFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUNsYXNzIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7DQotCQlyZXR1cm4gaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpIHsNCi0JCXJldHVybiAoRVJlZmVyZW5jZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1dlYk1ldGhvZHMoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9UYXJnZXROYW1lc3BhY2UoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdVc2UoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYk1ldGhvZCgpIHsNCi0JCXJldHVybiBpV2ViTWV0aG9kRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVdlYk1ldGhvZF9QYXJhbWV0ZXJzKCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlXZWJNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJNZXRob2RfRXhjbHVkZWQoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdVc2UoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYlBhcmFtKCkgew0KLQkJcmV0dXJuIGlXZWJQYXJhbUVDbGFzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJQYXJhbV9LaW5kKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX1R5cGVOYW1lKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViUGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJQYXJhbV9IZWFkZXIoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUNsYXNzIGdldElXZWJTZXJ2aWNlKCkgew0KLQkJcmV0dXJuIGlXZWJTZXJ2aWNlRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlXZWJTZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZV9UYXJnZXROYW1lc3BhY2UoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1BvcnROYW1lKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJTZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZV9Xc2RsTG9jYXRpb24oKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkgew0KLQkJcmV0dXJuIGlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpIHsNCi0JCXJldHVybiAoRVJlZmVyZW5jZSlpV2ViU2VydmljZVByb2plY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X05hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUNsYXNzIGdldElXZWJUeXBlKCkgew0KLQkJcmV0dXJuIGlXZWJUeXBlRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVFbnVtIGdldFdlYlBhcmFtS2luZCgpIHsNCi0JCXJldHVybiB3ZWJQYXJhbUtpbmRFRW51bTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFRW51bSBnZXRTT0FQQmluZGluZ1N0eWxlKCkgew0KLQkJcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGVFRW51bTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFRW51bSBnZXRTT0FQQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1VzZUVFbnVtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVFbnVtIGdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUVFbnVtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIERvbUZhY3RvcnkgZ2V0RG9tRmFjdG9yeSgpIHsNCi0JCXJldHVybiAoRG9tRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMNCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgew0KLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOw0KLQkJaXNDcmVhdGVkID0gdHJ1ZTsNCi0NCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcw0KLQkJaWRvbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJRE9NKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaWRvbUVDbGFzcywgSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMpOw0KLQ0KLQkJaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcywgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04pOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpSmF2YVdlYlNlcnZpY2VFbGVtZW50RUNsYXNzLCBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKTsNCi0NCi0JCWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCk7DQotCQljcmVhdGVFUmVmZXJlbmNlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUyk7DQotCQljcmVhdGVFUmVmZXJlbmNlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSk7DQotDQotCQlpV2ViTWV0aG9kRUNsYXNzID0gY3JlYXRlRUNsYXNzKElXRUJfTUVUSE9EKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVdlYk1ldGhvZEVDbGFzcywgSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlMpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fRVhDTFVERUQpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYk1ldGhvZEVDbGFzcywgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSk7DQotDQotCQlpV2ViUGFyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVdFQl9QQVJBTSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJQYXJhbUVDbGFzcywgSVdFQl9QQVJBTV9fS0lORCk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJQYXJhbUVDbGFzcywgSVdFQl9QQVJBTV9fVFlQRV9OQU1FKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlBhcmFtRUNsYXNzLCBJV0VCX1BBUkFNX19QQVJUX05BTUUpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViUGFyYW1FQ2xhc3MsIElXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViUGFyYW1FQ2xhc3MsIElXRUJfUEFSQU1fX0hFQURFUik7DQotDQotCQlpV2ViU2VydmljZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJV0VCX1NFUlZJQ0UpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViU2VydmljZUVDbGFzcywgSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlNlcnZpY2VFQ2xhc3MsIElXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJTZXJ2aWNlRUNsYXNzLCBJV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJTZXJ2aWNlRUNsYXNzLCBJV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04pOw0KLQ0KLQkJaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElXRUJfU0VSVklDRV9QUk9KRUNUKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSk7DQotDQotCQlpV2ViVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJV0VCX1RZUEUpOw0KLQ0KLQkJLy8gQ3JlYXRlIGVudW1zDQotCQl3ZWJQYXJhbUtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKFdFQl9QQVJBTV9LSU5EKTsNCi0JCXNvYXBCaW5kaW5nU3R5bGVFRW51bSA9IGNyZWF0ZUVFbnVtKFNPQVBfQklORElOR19TVFlMRSk7DQotCQlzb2FwQmluZGluZ1VzZUVFbnVtID0gY3JlYXRlRUVudW0oU09BUF9CSU5ESU5HX1VTRSk7DQotCQlzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0gPSBjcmVhdGVFRW51bShTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7DQotDQotCS8qKg0KLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcw0KLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsNCi0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47DQotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsNCi0NCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQ0KLQkJc2V0TmFtZShlTkFNRSk7DQotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsNCi0JCXNldE5zVVJJKGVOU19VUkkpOw0KLQ0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycw0KLQ0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzDQotDQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzDQotCQlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpKTsNCi0JCWlXZWJNZXRob2RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYlBhcmFtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpKTsNCi0JCWlXZWJTZXJ2aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpKTsNCi0JCWlXZWJUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpKTsNCi0NCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzDQotCQlpbml0RUNsYXNzKGlkb21FQ2xhc3MsIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTS5jbGFzcywgIklET00iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElET01fV2ViU2VydmljZVByb2plY3RzKCksIHRoaXMuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCksIG51bGwsICJ3ZWJTZXJ2aWNlUHJvamVjdHMiLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotDQotCQlpbml0RUNsYXNzKGlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MsIElKYXZhV2ViU2VydmljZUVsZW1lbnQuY2xhc3MsICJJSmF2YVdlYlNlcnZpY2VFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X0ltcGxlbWVudGF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbXBsZW1lbnRhdGlvbiIsIG51bGwsIDEsIDEsIElKYXZhV2ViU2VydmljZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIElKYXZhV2ViU2VydmljZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWluaXRFQ2xhc3MoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpbXBsaWNpdCIsIG51bGwsIDEsIDEsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSwgdGhpcy5nZXRJV2ViU2VydmljZSgpLCB0aGlzLmdldElXZWJTZXJ2aWNlX1NlcnZpY2VFbmRwb2ludCgpLCAiaW1wbGVtZW50aW5nV2ViU2VydmljZXMiLCBudWxsLCAxLCAtMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9XZWJNZXRob2RzKCksIHRoaXMuZ2V0SVdlYk1ldGhvZCgpLCBudWxsLCAid2ViTWV0aG9kcyIsIG51bGwsIDEsIC0xLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFyZ2V0TmFtZXNwYWNlIiwgbnVsbCwgMSwgMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCksIHRoaXMuZ2V0U09BUEJpbmRpbmdTdHlsZSgpLCAic29hcEJpbmRpbmdTdHlsZSIsICJET0NVTUVOVCIsIDEsIDEsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpLCB0aGlzLmdldFNPQVBCaW5kaW5nVXNlKCksICJzb2FwQmluZGluZ1VzZSIsICJMSVRFUkFMIiwgMSwgMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSwgdGhpcy5nZXRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKCksICJzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIiwgIldSQVBQRUQiLCAxLCAxLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JCWluaXRFQ2xhc3MoaVdlYk1ldGhvZEVDbGFzcywgSVdlYk1ldGhvZC5jbGFzcywgIklXZWJNZXRob2QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJNZXRob2RfUGFyYW1ldGVycygpLCB0aGlzLmdldElXZWJQYXJhbSgpLCBudWxsLCAicGFyYW1ldGVycyIsIG51bGwsIDEsIC0xLCBJV2ViTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZXhjbHVkZWQiLCBudWxsLCAxLCAxLCBJV2ViTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKSwgdGhpcy5nZXRTT0FQQmluZGluZ1N0eWxlKCksICJzb2FwQmluZGluZ1N0eWxlIiwgIkRPQ1VNRU5UIiwgMSwgMSwgSVdlYk1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCksIHRoaXMuZ2V0U09BUEJpbmRpbmdVc2UoKSwgInNvYXBCaW5kaW5nVXNlIiwgIkxJVEVSQUwiLCAxLCAxLCBJV2ViTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpLCB0aGlzLmdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSwgInNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiLCAiV1JBUFBFRCIsIDEsIDEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkJaW5pdEVDbGFzcyhpV2ViUGFyYW1FQ2xhc3MsIElXZWJQYXJhbS5jbGFzcywgIklXZWJQYXJhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX0tpbmQoKSwgdGhpcy5nZXRXZWJQYXJhbUtpbmQoKSwgImtpbmQiLCBudWxsLCAxLCAxLCBJV2ViUGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJQYXJhbV9UeXBlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZU5hbWUiLCBudWxsLCAxLCAxLCBJV2ViUGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJQYXJhbV9QYXJ0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFydE5hbWUiLCBudWxsLCAxLCAxLCBJV2ViUGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRhcmdldE5hbWVzcGFjZSIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX0hlYWRlcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImhlYWRlciIsICJmYWxzZSIsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCQlpbml0RUNsYXNzKGlXZWJTZXJ2aWNlRUNsYXNzLCBJV2ViU2VydmljZS5jbGFzcywgIklXZWJTZXJ2aWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RVJlZmVyZW5jZShnZXRJV2ViU2VydmljZV9TZXJ2aWNlRW5kcG9pbnQoKSwgdGhpcy5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIHRoaXMuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLCAic2VydmljZUVuZHBvaW50IiwgbnVsbCwgMCwgMSwgSVdlYlNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJTZXJ2aWNlX1RhcmdldE5hbWVzcGFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFyZ2V0TmFtZXNwYWNlIiwgbnVsbCwgMSwgMSwgSVdlYlNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJTZXJ2aWNlX1BvcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwb3J0TmFtZSIsIG51bGwsIDEsIDEsIElXZWJTZXJ2aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViU2VydmljZV9Xc2RsTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxMb2NhdGlvbiIsIG51bGwsIDAsIDEsIElXZWJTZXJ2aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotDQotCQlpbml0RUNsYXNzKGlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzcywgSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCAiSVdlYlNlcnZpY2VQcm9qZWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RVJlZmVyZW5jZShnZXRJV2ViU2VydmljZVByb2plY3RfV2ViU2VydmljZXMoKSwgdGhpcy5nZXRJV2ViU2VydmljZSgpLCBudWxsLCAid2ViU2VydmljZXMiLCBudWxsLCAwLCAtMSwgSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RVJlZmVyZW5jZShnZXRJV2ViU2VydmljZVByb2plY3RfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLCB0aGlzLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgbnVsbCwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMiLCBudWxsLCAwLCAtMSwgSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIElXZWJTZXJ2aWNlUHJvamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaW5pdEVDbGFzcyhpV2ViVHlwZUVDbGFzcywgSVdlYlR5cGUuY2xhc3MsICJJV2ViVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMNCi0JCWluaXRFRW51bSh3ZWJQYXJhbUtpbmRFRW51bSwgV2ViUGFyYW1LaW5kLmNsYXNzLCAiV2ViUGFyYW1LaW5kIik7IC8vJE5PTi1OTFMtMSQNCi0JCWFkZEVFbnVtTGl0ZXJhbCh3ZWJQYXJhbUtpbmRFRW51bSwgV2ViUGFyYW1LaW5kLklOKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbCh3ZWJQYXJhbUtpbmRFRW51bSwgV2ViUGFyYW1LaW5kLklOT1VUKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbCh3ZWJQYXJhbUtpbmRFRW51bSwgV2ViUGFyYW1LaW5kLk9VVCk7DQotDQotCQlpbml0RUVudW0oc29hcEJpbmRpbmdTdHlsZUVFbnVtLCBTT0FQQmluZGluZ1N0eWxlLmNsYXNzLCAiU09BUEJpbmRpbmdTdHlsZSIpOyAvLyROT04tTkxTLTEkDQotCQlhZGRFRW51bUxpdGVyYWwoc29hcEJpbmRpbmdTdHlsZUVFbnVtLCBTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1N0eWxlRUVudW0sIFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0NCi0JCWluaXRFRW51bShzb2FwQmluZGluZ1VzZUVFbnVtLCBTT0FQQmluZGluZ1VzZS5jbGFzcywgIlNPQVBCaW5kaW5nVXNlIik7IC8vJE5PTi1OTFMtMSQNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1VzZUVFbnVtLCBTT0FQQmluZGluZ1VzZS5MSVRFUkFMKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1VzZUVFbnVtLCBTT0FQQmluZGluZ1VzZS5FTkNPREVEKTsNCi0NCi0JCWluaXRFRW51bShzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0sIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuY2xhc3MsICJTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0sIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7DQotCQlhZGRFRW51bUxpdGVyYWwoc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUVFbnVtLCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQ0KLQkJLy8gQ3JlYXRlIHJlc291cmNlDQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsNCi0JfQ0KLQ0KLX0gLy9Eb21QYWNrYWdlSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JRE9NSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lET01JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhZTg2N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lET01JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklET008L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSURPTUltcGwjZ2V0V2ViU2VydmljZVByb2plY3RzIDxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElET01JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJRE9NIHsNCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYlNlcnZpY2VQcm9qZWN0cygpIDxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVdlYlNlcnZpY2VQcm9qZWN0PiB3ZWJTZXJ2aWNlUHJvamVjdHM7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElET01JbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLkxpdGVyYWxzLklET007DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2VQcm9qZWN0PiBnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSB7DQotCQlpZiAod2ViU2VydmljZVByb2plY3RzID09IG51bGwpDQotCQl7DQotCQkJd2ViU2VydmljZVByb2plY3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PElXZWJTZXJ2aWNlUHJvamVjdD4oSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTKTsNCi0JCX0NCi0JCXJldHVybiB3ZWJTZXJ2aWNlUHJvamVjdHM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFdlYlNlcnZpY2VQcm9qZWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlyZXR1cm4gZ2V0V2ViU2VydmljZVByb2plY3RzKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUzoNCi0JCQkJZ2V0V2ViU2VydmljZVByb2plY3RzKCkuY2xlYXIoKTsNCi0JCQkJZ2V0V2ViU2VydmljZVByb2plY3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJV2ViU2VydmljZVByb2plY3Q+KW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlyZXR1cm4gd2ViU2VydmljZVByb2plY3RzICE9IG51bGwgJiYgIXdlYlNlcnZpY2VQcm9qZWN0cy5pc0VtcHR5KCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi19IC8vSURPTUltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkODBjMTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9iPjwvZW0+Jy4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiA8cD4NCi0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCi0gKiA8dWw+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsI2dldEltcGxlbWVudGF0aW9uIDxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudCB7DQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wbGVtZW50YXRpb24oKSA8ZW0+SW1wbGVtZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldEltcGxlbWVudGF0aW9uKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wbGVtZW50YXRpb24oKSA8ZW0+SW1wbGVtZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldEltcGxlbWVudGF0aW9uKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBpbXBsZW1lbnRhdGlvbiA9IElNUExFTUVOVEFUSU9OX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb24oKSB7DQotCQlyZXR1cm4gaW1wbGVtZW50YXRpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvbihTdHJpbmcgbmV3SW1wbGVtZW50YXRpb24pIHsNCi0JCVN0cmluZyBvbGRJbXBsZW1lbnRhdGlvbiA9IGltcGxlbWVudGF0aW9uOw0KLQkJaW1wbGVtZW50YXRpb24gPSBuZXdJbXBsZW1lbnRhdGlvbjsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCBvbGRJbXBsZW1lbnRhdGlvbiwgaW1wbGVtZW50YXRpb24pKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JCXJldHVybiBuYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgew0KLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOw0KLQkJbmFtZSA9IG5ld05hbWU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOg0KLQkJCQlyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRToNCi0JCQkJcmV0dXJuIGdldE5hbWUoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT046DQotCQkJCXNldEltcGxlbWVudGF0aW9uKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU6DQotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjoNCi0JCQkJc2V0SW1wbGVtZW50YXRpb24oSU1QTEVNRU5UQVRJT05fRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU6DQotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT046DQotCQkJCXJldHVybiBJTVBMRU1FTlRBVElPTl9FREVGQVVMVCA9PSBudWxsID8gaW1wbGVtZW50YXRpb24gIT0gbnVsbCA6ICFJTVBMRU1FTlRBVElPTl9FREVGQVVMVC5lcXVhbHMoaW1wbGVtZW50YXRpb24pOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOg0KLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAoaW1wbGVtZW50YXRpb246ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKGltcGxlbWVudGF0aW9uKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQobmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0NCi19IC8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDBlNTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjaXNJbXBsaWNpdCA8ZW0+SW1wbGljaXQ8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyA8ZW0+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsI2dldFdlYk1ldGhvZHMgPGVtPldlYiBNZXRob2RzPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjZ2V0U29hcEJpbmRpbmdVc2UgPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59PC9saT4NCi0gKiA8L3VsPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugew0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW1wbGljaXQoKSA8ZW0+SW1wbGljaXQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzSW1wbGljaXQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU1QTElDSVRfRURFRkFVTFQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW1wbGljaXQoKSA8ZW0+SW1wbGljaXQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzSW1wbGljaXQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWNpdCA9IElNUExJQ0lUX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSA8ZW0+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViU2VydmljZT4gaW1wbGVtZW50aW5nV2ViU2VydmljZXM7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJNZXRob2RzKCkgPGVtPldlYiBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdlYk1ldGhvZHMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVdlYk1ldGhvZD4gd2ViTWV0aG9kczsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1N0eWxlIFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCA9IFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1N0eWxlKCkgPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTT0FQQmluZGluZ1N0eWxlIHNvYXBCaW5kaW5nU3R5bGUgPSBTT0FQX0JJTkRJTkdfU1RZTEVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdVc2UoKSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nVXNlIFNPQVBfQklORElOR19VU0VfRURFRkFVTFQgPSBTT0FQQmluZGluZ1VzZS5MSVRFUkFMOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdVc2UoKSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdVc2Ugc29hcEJpbmRpbmdVc2UgPSBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFX0VERUZBVUxUID0gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXQoKSB7DQotCQlyZXR1cm4gaW1wbGljaXQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdChib29sZWFuIG5ld0ltcGxpY2l0KSB7DQotCQlib29sZWFuIG9sZEltcGxpY2l0ID0gaW1wbGljaXQ7DQotCQlpbXBsaWNpdCA9IG5ld0ltcGxpY2l0Ow0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwgb2xkSW1wbGljaXQsIGltcGxpY2l0KSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2U+IGdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkgew0KLQkJaWYgKGltcGxlbWVudGluZ1dlYlNlcnZpY2VzID09IG51bGwpDQotCQl7DQotCQkJaW1wbGVtZW50aW5nV2ViU2VydmljZXMgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q8SVdlYlNlcnZpY2U+KElXZWJTZXJ2aWNlLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQpOw0KLQkJfQ0KLQkJcmV0dXJuIGltcGxlbWVudGluZ1dlYlNlcnZpY2VzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJNZXRob2Q+IGdldFdlYk1ldGhvZHMoKSB7DQotCQlpZiAod2ViTWV0aG9kcyA9PSBudWxsKQ0KLQkJew0KLQkJCXdlYk1ldGhvZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SVdlYk1ldGhvZD4oSVdlYk1ldGhvZC5jbGFzcywgdGhpcywgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTKTsNCi0JCX0NCi0JCXJldHVybiB3ZWJNZXRob2RzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7DQotCQlyZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UpIHsNCi0JCVN0cmluZyBvbGRUYXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7DQotCQl0YXJnZXROYW1lc3BhY2UgPSBuZXdUYXJnZXROYW1lc3BhY2U7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UsIG9sZFRhcmdldE5hbWVzcGFjZSwgdGFyZ2V0TmFtZXNwYWNlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU09BUEJpbmRpbmdTdHlsZSBnZXRTb2FwQmluZGluZ1N0eWxlKCkgew0KLQkJcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUgbmV3U29hcEJpbmRpbmdTdHlsZSkgew0KLQkJU09BUEJpbmRpbmdTdHlsZSBvbGRTb2FwQmluZGluZ1N0eWxlID0gc29hcEJpbmRpbmdTdHlsZTsNCi0JCXNvYXBCaW5kaW5nU3R5bGUgPSBuZXdTb2FwQmluZGluZ1N0eWxlID09IG51bGwgPyBTT0FQX0JJTkRJTkdfU1RZTEVfRURFRkFVTFQgOiBuZXdTb2FwQmluZGluZ1N0eWxlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUsIG9sZFNvYXBCaW5kaW5nU3R5bGUsIHNvYXBCaW5kaW5nU3R5bGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1VzZSBnZXRTb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1VzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlIG5ld1NvYXBCaW5kaW5nVXNlKSB7DQotCQlTT0FQQmluZGluZ1VzZSBvbGRTb2FwQmluZGluZ1VzZSA9IHNvYXBCaW5kaW5nVXNlOw0KLQkJc29hcEJpbmRpbmdVc2UgPSBuZXdTb2FwQmluZGluZ1VzZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nVXNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFLCBvbGRTb2FwQmluZGluZ1VzZSwgc29hcEJpbmRpbmdVc2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBuZXdTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKSB7DQotCQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIG9sZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQkJc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPT0gbnVsbCA/IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQgOiBuZXdTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFLCBvbGRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlLCBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikoSW50ZXJuYWxFTGlzdDw/PilnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0V2ViTWV0aG9kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQ6DQotCQkJCXJldHVybiBpc0ltcGxpY2l0KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuIGdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCXJldHVybiBnZXRXZWJNZXRob2RzKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJcmV0dXJuIGdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlyZXR1cm4gZ2V0U29hcEJpbmRpbmdVc2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJc2V0SW1wbGljaXQoKEJvb2xlYW4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJCQlnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVdlYlNlcnZpY2U+KW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTOg0KLQkJCQlnZXRXZWJNZXRob2RzKCkuY2xlYXIoKTsNCi0JCQkJZ2V0V2ViTWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVdlYk1ldGhvZD4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJc2V0VGFyZ2V0TmFtZXNwYWNlKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1N0eWxlKChTT0FQQmluZGluZ1N0eWxlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXNldFNvYXBCaW5kaW5nVXNlKChTT0FQQmluZGluZ1VzZSluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKChTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQ6DQotCQkJCXNldEltcGxpY2l0KElNUExJQ0lUX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVM6DQotCQkJCWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTOg0KLQkJCQlnZXRXZWJNZXRob2RzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXNldFRhcmdldE5hbWVzcGFjZShUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQX0JJTkRJTkdfU1RZTEVfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJc2V0U29hcEJpbmRpbmdVc2UoU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQ6DQotCQkJCXJldHVybiBpbXBsaWNpdCAhPSBJTVBMSUNJVF9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gaW1wbGVtZW50aW5nV2ViU2VydmljZXMgIT0gbnVsbCAmJiAhaW1wbGVtZW50aW5nV2ViU2VydmljZXMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTOg0KLQkJCQlyZXR1cm4gd2ViTWV0aG9kcyAhPSBudWxsICYmICF3ZWJNZXRob2RzLmlzRW1wdHkoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgOiAhVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1N0eWxlICE9IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlyZXR1cm4gc29hcEJpbmRpbmdVc2UgIT0gU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSAhPSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFX0VERUZBVUxUOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAoaW1wbGljaXQ6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKGltcGxpY2l0KTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0TmFtZXNwYWNlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1N0eWxlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChzb2FwQmluZGluZ1N0eWxlKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcEJpbmRpbmdVc2U6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHNvYXBCaW5kaW5nVXNlKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSk7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZSANCi0JcHVibGljIEVPYmplY3QgZUNvbnRhaW5lcigpDQotCXsNCi0JCWlmIChzdXBlci5lQ29udGFpbmVyKCkhPW51bGwpIHsNCi0JCQlyZXR1cm4gc3VwZXIuZUNvbnRhaW5lcigpOw0KLQkJfQ0KLQkJDQotCQlmb3IgKElXZWJTZXJ2aWNlIHdzIDogZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSkgew0KLQkJCWlmICh3cy5lQ29udGFpbmVyKCkhPW51bGwpIHsNCi0JCQkJcmV0dXJuIHdzLmVDb250YWluZXIoKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfSAvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJNZXRob2RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYk1ldGhvZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmJiYTQ5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYk1ldGhvZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SVdlYiBNZXRob2Q8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwjZ2V0UGFyYW1ldGVycyA8ZW0+UGFyYW1ldGVyczwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsI2lzRXhjbHVkZWQgPGVtPkV4Y2x1ZGVkPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwjZ2V0U29hcEJpbmRpbmdVc2UgPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59PC9saT4NCi0gKiA8L3VsPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYk1ldGhvZEltcGwgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElXZWJNZXRob2Qgew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVycygpIDxlbT5QYXJhbWV0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFBhcmFtZXRlcnMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVdlYlBhcmFtPiBwYXJhbWV0ZXJzOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZWQoKSA8ZW0+RXhjbHVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzRXhjbHVkZWQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhDTFVERURfRURFRkFVTFQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZWQoKSA8ZW0+RXhjbHVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzRXhjbHVkZWQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlZCA9IEVYQ0xVREVEX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1N0eWxlIFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCA9IFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1N0eWxlKCkgPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTT0FQQmluZGluZ1N0eWxlIHNvYXBCaW5kaW5nU3R5bGUgPSBTT0FQX0JJTkRJTkdfU1RZTEVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdVc2UoKSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nVXNlIFNPQVBfQklORElOR19VU0VfRURFRkFVTFQgPSBTT0FQQmluZGluZ1VzZS5MSVRFUkFMOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdVc2UoKSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdVc2Ugc29hcEJpbmRpbmdVc2UgPSBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFX0VERUZBVUxUID0gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJNZXRob2RJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJQYXJhbT4gZ2V0UGFyYW1ldGVycygpIHsNCi0JCWlmIChwYXJhbWV0ZXJzID09IG51bGwpDQotCQl7DQotCQkJcGFyYW1ldGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJV2ViUGFyYW0+KElXZWJQYXJhbS5jbGFzcywgdGhpcywgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUyk7DQotCQl9DQotCQlyZXR1cm4gcGFyYW1ldGVyczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZWQoKSB7DQotCQlyZXR1cm4gZXhjbHVkZWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlZChib29sZWFuIG5ld0V4Y2x1ZGVkKSB7DQotCQlib29sZWFuIG9sZEV4Y2x1ZGVkID0gZXhjbHVkZWQ7DQotCQlleGNsdWRlZCA9IG5ld0V4Y2x1ZGVkOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVELCBvbGRFeGNsdWRlZCwgZXhjbHVkZWQpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1N0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdTdHlsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSBuZXdTb2FwQmluZGluZ1N0eWxlKSB7DQotCQlTT0FQQmluZGluZ1N0eWxlIG9sZFNvYXBCaW5kaW5nU3R5bGUgPSBzb2FwQmluZGluZ1N0eWxlOw0KLQkJc29hcEJpbmRpbmdTdHlsZSA9IG5ld1NvYXBCaW5kaW5nU3R5bGUgPT0gbnVsbCA/IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFLCBvbGRTb2FwQmluZGluZ1N0eWxlLCBzb2FwQmluZGluZ1N0eWxlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU09BUEJpbmRpbmdVc2UgZ2V0U29hcEJpbmRpbmdVc2UoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdVc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZSBuZXdTb2FwQmluZGluZ1VzZSkgew0KLQkJU09BUEJpbmRpbmdVc2Ugb2xkU29hcEJpbmRpbmdVc2UgPSBzb2FwQmluZGluZ1VzZTsNCi0JCXNvYXBCaW5kaW5nVXNlID0gbmV3U29hcEJpbmRpbmdVc2UgPT0gbnVsbCA/IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQgOiBuZXdTb2FwQmluZGluZ1VzZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFLCBvbGRTb2FwQmluZGluZ1VzZSwgc29hcEJpbmRpbmdVc2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBuZXdTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKSB7DQotCQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIG9sZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQkJc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPT0gbnVsbCA/IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQgOiBuZXdTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUsIG9sZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUsIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGFyYW1ldGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTOg0KLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVycygpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQ6DQotCQkJCXJldHVybiBpc0V4Y2x1ZGVkKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1N0eWxlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlyZXR1cm4gZ2V0U29hcEJpbmRpbmdVc2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUzoNCi0JCQkJZ2V0UGFyYW1ldGVycygpLmNsZWFyKCk7DQotCQkJCWdldFBhcmFtZXRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElXZWJQYXJhbT4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19FWENMVURFRDoNCi0JCQkJc2V0RXhjbHVkZWQoKEJvb2xlYW4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nU3R5bGUoKFNPQVBCaW5kaW5nU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1VzZSgoU09BUEJpbmRpbmdVc2UpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKChTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTOg0KLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQ6DQotCQkJCXNldEV4Y2x1ZGVkKEVYQ0xVREVEX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXNldFNvYXBCaW5kaW5nVXNlKFNPQVBfQklORElOR19VU0VfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTOg0KLQkJCQlyZXR1cm4gcGFyYW1ldGVycyAhPSBudWxsICYmICFwYXJhbWV0ZXJzLmlzRW1wdHkoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVEOg0KLQkJCQlyZXR1cm4gZXhjbHVkZWQgIT0gRVhDTFVERURfRURFRkFVTFQ7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1N0eWxlICE9IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1VzZSAhPSBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgIT0gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVDsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOw0KLQ0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7DQotCQlyZXN1bHQuYXBwZW5kKCIgKGV4Y2x1ZGVkOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlZCk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nU3R5bGU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHNvYXBCaW5kaW5nU3R5bGUpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1VzZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoc29hcEJpbmRpbmdVc2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JV2ViTWV0aG9kSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViUGFyYW1JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlBhcmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTUwNGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViUGFyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SVdlYiBQYXJhbTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsI2dldEtpbmQgPGVtPktpbmQ8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsI2dldFR5cGVOYW1lIDxlbT5UeXBlIE5hbWU8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsI2dldFBhcnROYW1lIDxlbT5QYXJ0IE5hbWU8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjaXNIZWFkZXIgPGVtPkhlYWRlcjwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJQYXJhbUltcGwgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElXZWJQYXJhbSB7DQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRLaW5kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBXZWJQYXJhbUtpbmQgS0lORF9FREVGQVVMVCA9IFdlYlBhcmFtS2luZC5JTjsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0S2luZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBXZWJQYXJhbUtpbmQga2luZCA9IEtJTkRfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU5hbWUoKSA8ZW0+VHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUeXBlTmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTkFNRV9FREVGQVVMVCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlTmFtZSgpIDxlbT5UeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFR5cGVOYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlTmFtZSA9IFRZUEVfTkFNRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0TmFtZSgpIDxlbT5QYXJ0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFBhcnROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9OQU1FX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnROYW1lKCkgPGVtPlBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UGFydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnROYW1lID0gUEFSVF9OQU1FX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIZWFkZXIoKSA8ZW0+SGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNpc0hlYWRlcigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBIRUFERVJfRURFRkFVTFQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGVhZGVyKCkgPGVtPkhlYWRlcjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNIZWFkZXIoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoZWFkZXIgPSBIRUFERVJfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJQYXJhbUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBXZWJQYXJhbUtpbmQgZ2V0S2luZCgpIHsNCi0JCXJldHVybiBraW5kOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0S2luZChXZWJQYXJhbUtpbmQgbmV3S2luZCkgew0KLQkJV2ViUGFyYW1LaW5kIG9sZEtpbmQgPSBraW5kOw0KLQkJa2luZCA9IG5ld0tpbmQgPT0gbnVsbCA/IEtJTkRfRURFRkFVTFQgOiBuZXdLaW5kOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fS0lORCwgb2xkS2luZCwga2luZCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsNCi0JCXJldHVybiB0eXBlTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyBuZXdUeXBlTmFtZSkgew0KLQkJU3RyaW5nIG9sZFR5cGVOYW1lID0gdHlwZU5hbWU7DQotCQl0eXBlTmFtZSA9IG5ld1R5cGVOYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLCBvbGRUeXBlTmFtZSwgdHlwZU5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydE5hbWUoKSB7DQotCQlyZXR1cm4gcGFydE5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0TmFtZShTdHJpbmcgbmV3UGFydE5hbWUpIHsNCi0JCVN0cmluZyBvbGRQYXJ0TmFtZSA9IHBhcnROYW1lOw0KLQkJcGFydE5hbWUgPSBuZXdQYXJ0TmFtZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRSwgb2xkUGFydE5hbWUsIHBhcnROYW1lKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgew0KLQkJU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsNCi0JCXRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UsIG9sZFRhcmdldE5hbWVzcGFjZSwgdGFyZ2V0TmFtZXNwYWNlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0hlYWRlcigpIHsNCi0JCXJldHVybiBoZWFkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkZXIoYm9vbGVhbiBuZXdIZWFkZXIpIHsNCi0JCWJvb2xlYW4gb2xkSGVhZGVyID0gaGVhZGVyOw0KLQkJaGVhZGVyID0gbmV3SGVhZGVyOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSLCBvbGRIZWFkZXIsIGhlYWRlcikpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5EOg0KLQkJCQlyZXR1cm4gZ2V0S2luZCgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUU6DQotCQkJCXJldHVybiBnZXRUeXBlTmFtZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJCXJldHVybiBnZXRQYXJ0TmFtZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJcmV0dXJuIGlzSGVhZGVyKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJCXNldEtpbmQoKFdlYlBhcmFtS2luZCluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FOg0KLQkJCQlzZXRUeXBlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJCXNldFBhcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXNldFRhcmdldE5hbWVzcGFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVI6DQotCQkJCXNldEhlYWRlcigoQm9vbGVhbiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5EOg0KLQkJCQlzZXRLaW5kKEtJTkRfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RZUEVfTkFNRToNCi0JCQkJc2V0VHlwZU5hbWUoVFlQRV9OQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJCXNldFBhcnROYW1lKFBBUlRfTkFNRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJc2V0VGFyZ2V0TmFtZXNwYWNlKFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJc2V0SGVhZGVyKEhFQURFUl9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fS0lORDoNCi0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FOg0KLQkJCQlyZXR1cm4gVFlQRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyB0eXBlTmFtZSAhPSBudWxsIDogIVRZUEVfTkFNRV9FREVGQVVMVC5lcXVhbHModHlwZU5hbWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJCXJldHVybiBQQVJUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBhcnROYW1lICE9IG51bGwgOiAhUEFSVF9OQU1FX0VERUZBVUxULmVxdWFscyhwYXJ0TmFtZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXJldHVybiBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCA6ICFUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxULmVxdWFscyh0YXJnZXROYW1lc3BhY2UpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVI6DQotCQkJCXJldHVybiBoZWFkZXIgIT0gSEVBREVSX0VERUZBVUxUOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAoa2luZDogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoa2luZCk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGVOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZCh0eXBlTmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcnROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChwYXJ0TmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHRhcmdldE5hbWVzcGFjZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgaGVhZGVyOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChoZWFkZXIpOw0KLQkJcmVzdWx0LmFwcGVuZCgnKScpOw0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLQl9DQotDQotfSAvL0lXZWJQYXJhbUltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRlODQ1ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFNlcnZpY2U8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsI2dldFNlcnZpY2VFbmRwb2ludCA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbCNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbCNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViU2VydmljZUltcGwgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlIHsNCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludCgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59JyByZWZlcmVuY2UuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZXJ2aWNlRW5kcG9pbnQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPSBudWxsOw0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVDsNCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZSgpIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFBvcnROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9OQU1FX0VERUZBVUxUID0gbnVsbDsNCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvcnROYW1lID0gUE9SVF9OQU1FX0VERUZBVUxUOw0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxMb2NhdGlvbigpIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsNCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxMb2NhdGlvbigpIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRXc2RsTG9jYXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFdTRExfTE9DQVRJT05fRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlSW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTZXJ2aWNlRW5kcG9pbnQoKSB7DQotCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG51bGwgJiYgc2VydmljZUVuZHBvaW50LmVJc1Byb3h5KCkpDQotCQl7DQotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNlcnZpY2VFbmRwb2ludCA9IChJbnRlcm5hbEVPYmplY3Qpc2VydmljZUVuZHBvaW50Ow0KLQkJCXNlcnZpY2VFbmRwb2ludCA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWVSZXNvbHZlUHJveHkob2xkU2VydmljZUVuZHBvaW50KTsNCi0JCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG9sZFNlcnZpY2VFbmRwb2ludCkNCi0JCQl7DQotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCwgb2xkU2VydmljZUVuZHBvaW50LCBzZXJ2aWNlRW5kcG9pbnQpKTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgYmFzaWNHZXRTZXJ2aWNlRW5kcG9pbnQoKSB7DQotCQlyZXR1cm4gc2VydmljZUVuZHBvaW50Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VydmljZUVuZHBvaW50KElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgbmV3U2VydmljZUVuZHBvaW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9sZFNlcnZpY2VFbmRwb2ludCA9IHNlcnZpY2VFbmRwb2ludDsNCi0JCXNlcnZpY2VFbmRwb2ludCA9IG5ld1NlcnZpY2VFbmRwb2ludDsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCXsNCi0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIG9sZFNlcnZpY2VFbmRwb2ludCwgbmV3U2VydmljZUVuZHBvaW50KTsNCi0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7DQotCQl9DQotCQlyZXR1cm4gbXNnczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG5ld1NlcnZpY2VFbmRwb2ludCkgew0KLQkJaWYgKG5ld1NlcnZpY2VFbmRwb2ludCAhPSBzZXJ2aWNlRW5kcG9pbnQpDQotCQl7DQotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7DQotCQkJaWYgKHNlcnZpY2VFbmRwb2ludCAhPSBudWxsKQ0KLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2VydmljZUVuZHBvaW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUywgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgbXNncyk7DQotCQkJaWYgKG5ld1NlcnZpY2VFbmRwb2ludCAhPSBudWxsKQ0KLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VydmljZUVuZHBvaW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUywgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgbXNncyk7DQotCQkJbXNncyA9IGJhc2ljU2V0U2VydmljZUVuZHBvaW50KG5ld1NlcnZpY2VFbmRwb2ludCwgbXNncyk7DQotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOw0KLQkJfQ0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIG5ld1NlcnZpY2VFbmRwb2ludCwgbmV3U2VydmljZUVuZHBvaW50KSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgew0KLQkJU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsNCi0JCXRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSwgb2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKSB7DQotCQlyZXR1cm4gcG9ydE5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgbmV3UG9ydE5hbWUpIHsNCi0JCVN0cmluZyBvbGRQb3J0TmFtZSA9IHBvcnROYW1lOw0KLQkJcG9ydE5hbWUgPSBuZXdQb3J0TmFtZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FLCBvbGRQb3J0TmFtZSwgcG9ydE5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbExvY2F0aW9uKCkgew0KLQkJcmV0dXJuIHdzZGxMb2NhdGlvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgbmV3V3NkbExvY2F0aW9uKSB7DQotCQlTdHJpbmcgb2xkV3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uOw0KLQkJd3NkbExvY2F0aW9uID0gbmV3V3NkbExvY2F0aW9uOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OLCBvbGRXc2RsTG9jYXRpb24sIHdzZGxMb2NhdGlvbikpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbCkNCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXJ2aWNlRW5kcG9pbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCBtc2dzKTsNCi0JCQkJcmV0dXJuIGJhc2ljU2V0U2VydmljZUVuZHBvaW50KChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKW90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UOg0KLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQobnVsbCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDoNCi0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQkJcmV0dXJuIGJhc2ljR2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJcmV0dXJuIGdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRToNCi0JCQkJcmV0dXJuIGdldFBvcnROYW1lKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTjoNCi0JCQkJcmV0dXJuIGdldFdzZGxMb2NhdGlvbigpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXNldFNlcnZpY2VFbmRwb2ludCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlzZXRUYXJnZXROYW1lc3BhY2UoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUU6DQotCQkJCXNldFBvcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTjoNCi0JCQkJc2V0V3NkbExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UOg0KLQkJCQlzZXRTZXJ2aWNlRW5kcG9pbnQoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpbnVsbCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlzZXRUYXJnZXROYW1lc3BhY2UoVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUU6DQotCQkJCXNldFBvcnROYW1lKFBPUlRfTkFNRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OOg0KLQkJCQlzZXRXc2RsTG9jYXRpb24oV1NETF9MT0NBVElPTl9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UOg0KLQkJCQlyZXR1cm4gc2VydmljZUVuZHBvaW50ICE9IG51bGw7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJcmV0dXJuIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldE5hbWVzcGFjZSAhPSBudWxsIDogIVRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FOg0KLQkJCQlyZXR1cm4gUE9SVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwb3J0TmFtZSAhPSBudWxsIDogIVBPUlRfTkFNRV9FREVGQVVMVC5lcXVhbHMocG9ydE5hbWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT046DQotCQkJCXJldHVybiBXU0RMX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyB3c2RsTG9jYXRpb24gIT0gbnVsbCA6ICFXU0RMX0xPQ0FUSU9OX0VERUZBVUxULmVxdWFscyh3c2RsTG9jYXRpb24pOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAodGFyZ2V0TmFtZXNwYWNlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBwb3J0TmFtZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQocG9ydE5hbWUpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsTG9jYXRpb246ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHdzZGxMb2NhdGlvbik7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0NCi19IC8vSVdlYlNlcnZpY2VJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJTZXJ2aWNlUHJvamVjdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViU2VydmljZVByb2plY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDliMTNmM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJTZXJ2aWNlUHJvamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCNnZXRXZWJTZXJ2aWNlcyA8ZW0+V2ViIFNlcnZpY2VzPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViU2VydmljZVByb2plY3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJV2ViU2VydmljZVByb2plY3Qgew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViU2VydmljZXMoKSA8ZW0+V2ViIFNlcnZpY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VzKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIEVMaXN0PElXZWJTZXJ2aWNlPiB3ZWJTZXJ2aWNlczsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZT4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlczsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdEltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX1BST0pFQ1Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2U+IGdldFdlYlNlcnZpY2VzKCkgew0KLQkJaWYgKHdlYlNlcnZpY2VzID09IG51bGwpDQotCQl7DQotCQkJd2ViU2VydmljZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SVdlYlNlcnZpY2U+KElXZWJTZXJ2aWNlLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMpOw0KLQkJfQ0KLQkJcmV0dXJuIHdlYlNlcnZpY2VzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSB7DQotCQlpZiAoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZT4oSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgdGhpcywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTKTsNCi0JCX0NCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7DQotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7DQotCQluYW1lID0gbmV3TmFtZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0V2ViU2VydmljZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gZ2V0V2ViU2VydmljZXMoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzoNCi0JCQkJcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCXJldHVybiBnZXROYW1lKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCQlnZXRXZWJTZXJ2aWNlcygpLmNsZWFyKCk7DQotCQkJCWdldFdlYlNlcnZpY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJV2ViU2VydmljZT4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVM6DQotCQkJCWdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5jbGVhcigpOw0KLQkJCQlnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCQlnZXRXZWJTZXJ2aWNlcygpLmNsZWFyKCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzoNCi0JCQkJZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmNsZWFyKCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuIHdlYlNlcnZpY2VzICE9IG51bGwgJiYgIXdlYlNlcnZpY2VzLmlzRW1wdHkoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzoNCi0JCQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMgIT0gbnVsbCAmJiAhc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcy5pc0VtcHR5KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FOg0KLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQobmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0NCi19IC8vSVdlYlNlcnZpY2VQcm9qZWN0SW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTFjNTk4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGU7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SVdlYiBUeXBlPC9iPjwvZW0+Jy4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiA8cD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJUeXBlSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYlR5cGUgew0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJV2ViVHlwZUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9UWVBFOw0KLQl9DQotDQotfSAvL0lXZWJUeXBlSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL0pheFdzRG9tUnVudGltZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3BsdWdpbi9KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWFmMTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL0pheFdzRG9tUnVudGltZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW47DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7DQotDQotcHVibGljIGNsYXNzIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4ubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdENsYXNzTm90SW1wbGVtZW50ZWRFeGNlcHRpb25fRXJyb3JfTWVzc2FnZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb25fRXJyb3JfTWVzc2FnZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQklOQVJZQ0xBU1M7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZHBvaW50VHlwZVZhbGlkYXRvcl9FUlJfTVNHX05PVENMQVNTOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmRwb2ludFR5cGVWYWxpZGF0b3JfRVJSX01TR19BQlNUUkFDVDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQ09OU1RSVUNUT1I7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZHBvaW50VHlwZVZhbGlkYXRvcl9FUlJfTVNHX05PVFBVQkxJQzsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfRklOQUw7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZHBvaW50VHlwZVZhbGlkYXRvcl9FUlJfTVNHX0hBU0ZJTkFMWVpFOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIYXNJbmFkbWlzYWJsZUlubmVyVHlwZXNFeGNlcHRpb25fRXJyb3JfTWVzc2FnZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5oZXJpdGFuY2VBbmRJbXBsZW1lbnRhdGlvbkV4ZWNwdGlvbl9FcnJvcl9NZXNzYWdlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcmZhY2VzTm90U3VwcG9ydGVkRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2U7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZE5vdFB1YmxpY0V4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aXBsZUltcGxlbWVudGF0aW9uRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2U7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW90ZU9iamVjdEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudF9TdGFydHVwX0pvYl9NZXNzYWdlOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3Jrc3BhY2VDVUZpbmRlcl9MT0FESU5HX0NBTkNFTEVEOw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19ET01fTE9BRElORzsNCi0JDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yX01FVEhPRF9OT1RfRk9VTkQ7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yX01FVEhPRF9IQVNESUZGRVJFTlRfRVhDRVBUSU9OUzsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3JfTUVUSE9EX05PVF9QVUJMSUM7DQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWlWYWxpZGF0b3JfTk9UX0NPTVBJTEFUSU9OVU5JVF9NU0c7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlaVZhbGlkYXRvcl9OT1RfSU5URVJGQUNFX01TRzsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VpVmFsaWRhdG9yX05PVF9PVVRFUl9NU0c7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlaVZhbGlkYXRvcl9OT1RfUFVCTElDX01TRzsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZU5vdEZvdW5kRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2U7DQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50X1VSSV9TWU5UQVhfRVJST1I7DQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3JfV1NfRE9NX1ZBTElEQVRJT05fQ09OU1RSQUlOVDsNCi0NCi0JDQotCXN0YXRpYyB7DQotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQ0KLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuY2xhc3MpOw0KLQl9DQotDQotCXByaXZhdGUgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMoKSB7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3BsdWdpbi9KYXhXc0RvbVJ1bnRpbWVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTlmOGZkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3BsdWdpbi9KYXhXc0RvbVJ1bnRpbWVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotLyoqDQotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlDQotICovDQotcHVibGljIGNsYXNzIEpheFdzRG9tUnVudGltZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7DQotDQotCS8vIFRoZSBwbHVnLWluIElEDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiOw0KLQ0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQotCXByaXZhdGUgc3RhdGljIEpheFdzRG9tUnVudGltZVBsdWdpbiBwbHVnaW47DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgSmF4V3NEb21SdW50aW1lUGx1Z2luKCkgew0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zdGFydChjb250ZXh0KTsNCi0JCXBsdWdpbiA9IHRoaXM7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEpheFdzRG9tUnVudGltZVBsdWdpbiBnZXREZWZhdWx0KCkgew0KLQkJcmV0dXJuIHBsdWdpbjsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3BsdWdpbi9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDUxOTc1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3BsdWdpbi9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLUFic3RyYWN0Q2xhc3NOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlPUFic3RyYWN0IGNsYXNzIHswfSBjYW5ub3QgYmUgdXNlZCBhcyBydW50aW1lIGNsYXNzIGJlY2F1c2UgaXQgaXMgbm90IGV4dGVuZGVkIGJ5IG5vbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBpcyBzdWl0YWJsZSBmb3IgYSBydW50aW1lIGNsYXNzDQotQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb25fRXJyb3JfTWVzc2FnZT1Db25zdHJ1Y3RvciB7MH0gY2Fubm90IGJlIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2Ugb3BlcmF0aW9uDQotRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQklOQVJZQ0xBU1MJPSBDbGFzcyB7MH0gaXMgYmluYXJ5IGNsYXNzIGFuZCBjYW5ub3QgYmUgYW5ub3RhdGVkDQotRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfTk9UQ0xBU1MJCT0gezB9IGlzIG5vdCBhIGNsYXNzDQotRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQUJTVFJBQ1QJCT0gQ2xhc3MgezB9IGlzIGFic3RyYWN0DQotRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQ09OU1RSVUNUT1IJPSBDbGFzcyB7MH0gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3INCi1FbmRwb2ludFR5cGVWYWxpZGF0b3JfRVJSX01TR19OT1RQVUJMSUMJCT0gQ2xhc3MgezB9IGlzIG5vdCBwdWJsaWMgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHdlYiBzZXJ2aWNlIGVuZHBvaW50DQotRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfRklOQUwJCQk9IENsYXNzIHswfSBpcyBmaW5hbCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgd2ViIHNlcnZpY2UgZW5kcG9pbnQNCi1FbmRwb2ludFR5cGVWYWxpZGF0b3JfRVJSX01TR19IQVNGSU5BTFlaRQk9IENsYXNzIHswfSBjb250YWlucyBmaW5hbGl6ZSgpIG1ldGhvZCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgd2ViIHNlcnZpY2UgZW5kcG9pbnQNCi1IYXNJbmFkbWlzYWJsZUlubmVyVHlwZXNFeGNlcHRpb25fRXJyb3JfTWVzc2FnZT1DbGFzcyB7MH0gaGFzIGlubmVyIHR5cGVzIHRoYXQgYXJlIG5vdCBwdWJsaWMgYW5kIHN0YXRpYw0KLUluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb25fRXJyb3JfTWVzc2FnZT1DbGFzcyB7MH0gZXh0ZW5kcyB7MX0gYW5kIGltcGxlbWVudHMgY3VzdG9tIGludGVyZmFjZSAobXVsdGlwbGUgaW5oZXJpdGFuY2UgaXMgbm90IGFsbG93ZWQpDQotSW50ZXJmYWNlc05vdFN1cHBvcnRlZEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlPXswfSBpcyBhIGludGVyZmFjZSwgYW5kIEpBWEIgY2Fubm90IGhhbmRsZSBpbnRlcmZhY2VzDQotTWV0aG9kTm90UHVibGljRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2U9TWV0aG9kIHswfSBpcyBub3QgcHVibGljIGFuZCBjYW5ub3QgYmUgZXhwb3NlZCBhcyBhIHdlYiBzZXJ2aWNlIG9wZXJhdGlvbg0KLU11bHRpcGxlSW1wbGVtZW50YXRpb25FeGNlcHRpb25fRXJyb3JfTWVzc2FnZT1DbGFzcyB7MH0gaW1wbGVtZW50cyBib3RoIGludGVyZmFjZSB7MX0gYW5kIGludGVyZmFjZSB7Mn0gKG11bHRpcGxlIGluaGVyaXRhbmNlIGlzIG5vdCBhbGxvd2VkKQ0KLVJlbW90ZU9iamVjdEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlPUNsYXNzIHswfSBpcyBhIHJlbW90ZSBPYmplY3QNCi0NCi0NCi1Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudF9TdGFydHVwX0pvYl9NZXNzYWdlCT1Mb2FkaW5nIFdlYiBTZXJ2aWNlIERPTS4uLg0KLVdvcmtzcGFjZUNVRmluZGVyX0xPQURJTkdfQ0FOQ0VMRUQ9SkFYLVdTIERPTSBsb2FkaW5nIGNhbmNlbGVkDQotSkFYV1NfRE9NX0xPQURJTkc9TG9hZGluZyBET00gZm9yIEpBWC1XUyBXZWIgU2VydmljZXMNCi1TZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcl9NRVRIT0RfTk9UX0ZPVU5EID0gTWV0aG9kIHswfSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGJlYW4gezF9LiBJdCBpcyByZXF1aXJlZCB0aGF0IHRoZSBiZWFuIGltcGxlbWVudHMgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBzcGVjaWZpZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UNCi1TZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcl9NRVRIT0RfSEFTRElGRkVSRU5UX0VYQ0VQVElPTlMgPSBNZXRob2QgezB9IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWFuIHsxfSBpcyBkZWNsYXJlZCB0byB0aHJvdyBleGNlcHRpb25zIHRoYXQgZGlmZmVyIGZyb20gZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIHNhbWUgbWV0aG9kIGluIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZQ0KLVNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yX01FVEhPRF9OT1RfUFVCTElDPSBNZXRob2QgezB9IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWFuIHsxfSBpcyBub3QgcHVibGljIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGV4cG9zZWQgYXMgYSB3ZWIgc2VydmljZSBvcGVyYXRpb24NCi0NCi0NCi1TZWlWYWxpZGF0b3JfTk9UX0NPTVBJTEFUSU9OVU5JVF9NU0cgPSB7MH0gaXMgYSBiaW5hcnkgaW50ZXJmYWNlIGFuZCBjYW5ub3QgYW5ub3RhdGVkIGFzIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UNCi1TZWlWYWxpZGF0b3JfTk9UX0lOVEVSRkFDRV9NU0cgPSB7MH0gaXMgbm90IGEgaW50ZXJmYWNlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlDQotU2VpVmFsaWRhdG9yX05PVF9PVVRFUl9NU0cgPSB7MH0gaXMgbm90IGEgb3V0ZXIgaW50ZXJmYWNlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlDQotU2VpVmFsaWRhdG9yX05PVF9QVUJMSUNfTVNHID0gezB9IGlzIG5vdCBhIHB1YmxpYyBpbnRlcmZhY2UgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UNCi1UeXBlTm90Rm91bmRFeGNlcHRpb25fRXJyb3JfTWVzc2FnZT1DbGFzcyB7MH0gY2Fubm90IGJlIGZvdW5kDQotDQotRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yX1dTX0RPTV9WQUxJREFUSU9OX0NPTlNUUkFJTlQ9V2ViU2VydmljZSBET00gdmFsaWRhdGlvbiBjb25zdHJhaW50DQotVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnRfVVJJX1NZTlRBWF9FUlJPUj1VUkkgc3ludGF4IGVycm9yIGF0IGluZGV4IHswfSBvZiBpbnB1dCBTdHJpbmcgJyd7MX0nJy4gUmVhc29uOiB7Mn0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvTmFtZWRFeHRlbnNpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3Y2E1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC91dGlsL05hbWVkRXh0ZW5zaW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklOYW1lZEV4dGVuc2lvbkluZm87DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHtAbGluayBJTmFtZWRFeHRlbnNpb25JbmZvfS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmFtZWRFeHRlbnNpb25JbmZvIGltcGxlbWVudHMgSU5hbWVkRXh0ZW5zaW9uSW5mbw0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7DQotDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCXByb3RlY3RlZCBOYW1lZEV4dGVuc2lvbkluZm8oZmluYWwgU3RyaW5nIHBJZCwgZmluYWwgU3RyaW5nIHBMYWJlbCkNCi0Jew0KLQkJdGhpcy5pZCA9IHBJZDsNCi0JCXRoaXMubmFtZSA9IHBMYWJlbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkNCi0Jew0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotCXsNCi0JCXJldHVybiBuYW1lOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdXRpbC9YcFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdXRpbC9YcFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDY0MjJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvWHBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB3b3JraW5nIHdpdGggZXh0ZW5kaW9uIHBvaW50cy4NCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgWHBVdGlsDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEID0gIkNvbnN1bWVyVHlwZSBleHRlbnNpb24gbm90IHByb3Blcmx5IHJlZ2lzdGVyZWQgKGVycm9yIGluIHBsdWdpbi54bWwpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlQgPSAiaW1wbGVtZW50YXRpb24iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiAgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gZXh0DQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgZXh0ZW50aW9uIGltcGxlbWVudGF0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUltcGxlbWVudGF0aW9uKGZpbmFsIElFeHRlbnNpb24gZXh0KQ0KLQl7DQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbCA6IGV4dC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSkNCi0JCXsNCi0JCQlpZiAoZWwuZ2V0TmFtZSgpLmVxdWFscyhYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UKSkNCi0JCQl7DQotCQkJCXRyeQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZWwuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UX0NMQVNTX0FUVFIpOw0KLQkJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGUpDQotCQkJCXsNCi0JCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gY3JlYXRlIGV4dGVuc2lvbiIsIGUpOyAvLyROT04tTkxTLTEkDQotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWxvZ2dlcigpLmxvZ0Vycm9yKEVYVEVOU0lPTl9OT1RfUFJPUEVSTFlfUkVHSVNURVJFRCk7DQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3ZhbGlkYXRpb24vcHJvdmlkZXIvVHlwZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmRjMjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnZhbGlkYXRpb24ucHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkdlbmVyYWxUeXBlc05hbWVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuVHlwZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLlR5cGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi0NCi0vKioNCi0gKiBUeXBlUHJveHkgcmVwcmVzZW50cyBhIHR5cGUgaW4gYSB3YXkgY29udmllbmllbnQgZm9yIHR5cGUgY2hlY2tpbmcuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUeXBlQWRhcHRlcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBJVHlwZSB0eXBlOw0KLQ0KLQlwcml2YXRlIFN0cmluZyBzdXBlckNsYXNzTmFtZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtDQotCSAqICAgICAgICAgICAgIGluIGNhc2UgPGNvZGU+dHlwZTwvY29kZT4gaXMgbnVsbC4NCi0JICovDQotCXB1YmxpYyBUeXBlQWRhcHRlcihJVHlwZSB0eXBlKQ0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0odHlwZSwgInR5cGUiKTsNCi0JCXRoaXMudHlwZSA9IHR5cGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyBmb3IgZGVmYXVsdCBjb25zdHJ1Y3RvciBpbiBhbmFseXNlZCBjbGFzcy4NCi0JICogDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBwdWJsaWMgY29uc3RydWN0b3Igd2l0aG91dCBwYXJhbWV0aGVycyBleGlzdHMgb3IgY2xhc3MgZG9lcyBub3QgaGF2ZSBhbnkgY29uc3RydWN0b3IuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNEZWZhdWx0Q29uc3RydWN0b3IoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWJvb2xlYW4gaGFzQ29uc3RydWN0b3IgPSBmYWxzZTsNCi0JCWJvb2xlYW4gaXNQdWJsaWMgPSBmYWxzZTsNCi0NCi0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiB0eXBlLmdldE1ldGhvZHMoKSkNCi0JCXsNCi0JCQlpc1B1YmxpYyA9IEZsYWdzLmlzUHVibGljKG1ldGhvZC5nZXRGbGFncygpKTsNCi0JCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkNCi0JCQl7DQotCQkJCWhhc0NvbnN0cnVjdG9yID0gdHJ1ZTsNCi0JCQl9DQotDQotCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgaXNQdWJsaWMgJiYgbWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCkubGVuZ3RoID09IDApDQotCQkJew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gIWhhc0NvbnN0cnVjdG9yOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgdGhlIGRpcmVjdCBzdXBlciBpbnRlcmZhY2VzIGZ1bGx5IHF1YWxpZmllZCBuYW1lcy4NCi0JICogDQotCSAqIEByZXR1cm4gbGlzdCBvZiBpbnRlcmZhY2UgbmFtZXMgLSBpbiBjYXNlIG5vIGludGVyZmFjZXMgYXJlIGltcGxlbWVudGVkIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldEludGVyZmFjZU5hbWVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmdbXSBpTmFtZXMgPSB0eXBlLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKTsNCi0JCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihpTmFtZXMubGVuZ3RoKTsNCi0JCWZvciAoU3RyaW5nIG5hbWUgOiBpTmFtZXMpDQotCQl7DQotCQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZShuYW1lLCB0eXBlKTsNCi0JCQlpbnRlcmZhY2VOYW1lcy5hZGQocmVzb2x2ZWROYW1lKTsNCi0JCX0NCi0NCi0JCXJldHVybiBpbnRlcmZhY2VOYW1lczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSBjbGFzcyBjb250YWlucyBub24gc3RhdGljIGFuZCBub24gcHVibGljIGlubmVyIGNsYXNzZXMuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRydWUgaWYgY29udGFpbnMgc3VjaA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaGFzTm9uU3RhdGljT3JOb25QdWJsaWNJbm5lclR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKElUeXBlIHQgOiB0eXBlLmdldFR5cGVzKCkpDQotCQl7DQotCQkJaW50IHR5cGVGbGFncyA9IHQuZ2V0RmxhZ3MoKTsNCi0JCQlpZiAoIUZsYWdzLmlzU3RhdGljKHR5cGVGbGFncykgfHwgIUZsYWdzLmlzUHVibGljKHR5cGVGbGFncykpDQotCQkJew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiBpdCdzIHN1cGVyY2xhc3MNCi0JICogDQotCSAqIEByZXR1cm4gcmV0dXJuZXMgcmVzb2x2ZWQgc3VwZXIgY2xhc3MgbmFtZSBvciBudWxsIGlmIG5vdCBwcmVzZW50DQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN1cGVyQ2xhc3NOYW1lKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAodHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpICE9IG51bGwgJiYgc3VwZXJDbGFzc05hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQlzdXBlckNsYXNzTmFtZSA9IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZSh0eXBlLmdldFN1cGVyY2xhc3NOYW1lKCksIHR5cGUpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHN1cGVyQ2xhc3NOYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXNvbHZlcyBhbmQgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUeXBlUHJveHkgZm9yIHN1cGVyIGNsYXNzLg0KLQkgKiANCi0JICogQHJldHVybiByZXR1cm5zIGluc3RhbmNlIG9mIHtAbGluayBUeXBlQWRhcHRlcn0gZm9yIHN1cGVyIGNsYXNzIG9yIG51bGwgaWYgbm90IHByZXNlbnQNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogQHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBmaW5hbCBUeXBlQWRhcHRlciBnZXRTdXBlckNsYXNzVHlwZSgpIHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoZ2V0U3VwZXJDbGFzc05hbWUoKSA9PSBudWxsKQ0KLQkJCXJldHVybiBudWxsOw0KLQ0KLQkJcmV0dXJuIG5ldyBUeXBlQWRhcHRlcihUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0U3VwZXJDbGFzc05hbWUoKSwgZ2V0VHlwZSgpKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIERlZmluZXMgaWYgdGhpcyBjbGFzcyBleHRlbmRzIDx0dD5iYXNlQ2xhc3NUeXBlPC90dD4NCi0JICogDQotCSAqIEBwYXJhbSBiYXNlQ2xhc3NUeXBlDQotCSAqIEByZXR1cm4gY2hlY2sgaWYgdGhpcyBjbGFzcyB0eXBlIGV4dGVuZHMgPHR0PmJhc2VDbGFzc1R5cGU8L3R0Pg0KLQkgKiBAdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlbmRpbmcoU3RyaW5nIGJhc2VDbGFzc1R5cGUpIHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgdHlwZU5hbWUgPSB0aGlzLmdldFF1YWxpZmllZE5hbWUoKTsNCi0NCi0JCS8vIGlmIHdlIGhhdmUgYXJyaXZlZCBhdCBvYmplY3QgaW4gdGhlIGhpZXJhcmNoeSwgdGhlIHR5cGUgY2Fubm90IGJlIGFuIGV4Y2VwdGlvbg0KLQkJaWYgKHR5cGVOYW1lLmVxdWFscyhHZW5lcmFsVHlwZXNOYW1lcy5KQVZBX0xBTkdfT0JKRUNUKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkvLyBBbGwgZXhjZXB0aW9ucyBpbmhlcml0IGZyb20gVGhyb3dhYmxlDQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKGJhc2VDbGFzc1R5cGUpKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQ0KLQkJVHlwZUFkYXB0ZXIgcGFyZW50VHlwZSA9IGdldFN1cGVyQ2xhc3NUeXBlKCk7DQotCQlpZiAocGFyZW50VHlwZSAhPSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBwYXJlbnRUeXBlLmlzRXh0ZW5kaW5nKGJhc2VDbGFzc1R5cGUpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgPGNvZGU+dHlwZTwvY29kZT4gaW1wbGVtZW50cyBpbnRlcmZhY2UgPGNvZGU+Y2hlY2tlZEludGVyZmFjZU5hbWU8L2NvZGU+LiBSZWN1cnNpdmUgY2hlY2sgb3ZlciB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcyBpcw0KLQkgKiBkb25lIHdoaWNoIGRlZmluZXMgaWYgc29tZSBvZiB0aGUgaW1wbGVtZW50ZWQgaW4gPGNvZGU+dHlwZTwvY29kZT4gaW50ZXJmYWNlIGlzIGV4dGVuZGluZyB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4NCi0JICogDQotCSAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lDQotCSAqIEByZXR1cm4gdHJ1ZSBpcyB0aGlzIGNsYXNzIHR5cGUgaW1wbGVtZW50cyA8dHQ+aW50ZXJmYWNlTmFtZTwvdHQ+DQotCSAqIEB0aHJvd3MgVHlwZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxlbWVudGluZyhmaW5hbCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBpc0ltcGxlbWVudGluZyh0aGlzLCBpbnRlcmZhY2VOYW1lKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbXBsZW1lbnRpbmcoZmluYWwgVHlwZUFkYXB0ZXIgY2hlY2tlZFR5cGUsIGZpbmFsIFN0cmluZyBjaGVja2VkSW50ZXJmYWNlTmFtZSkgdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uDQotDQotCXsNCi0JCWlmIChjaGVja2VkVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGNoZWNrZWRJbnRlcmZhY2VOYW1lKSkNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0NCi0JCWZvciAoU3RyaW5nIGludGVyZmFjZU5hbWUgOiBjaGVja2VkVHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpKQ0KLQkJew0KLQkJCVR5cGVBZGFwdGVyIHRhID0gbmV3IFR5cGVBZGFwdGVyKFR5cGVGYWN0b3J5LmNyZWF0ZShpbnRlcmZhY2VOYW1lLCBjaGVja2VkVHlwZS5nZXRUeXBlKCkpKTsNCi0JCQlpZiAoaXNJbXBsZW1lbnRpbmcodGEsIGNoZWNrZWRJbnRlcmZhY2VOYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGhlcmUgdXNlIGVwIGNoZWNrZXIgYXMgc2VyaWFibGl6YWJsZSBpcyBub3QgcmVxdWlyZWQgaW4gc3VwZXJ0eXBlDQotCQlpZiAoY2hlY2tlZFR5cGUuZ2V0U3VwZXJDbGFzc05hbWUoKSAhPSBudWxsKQ0KLQkJew0KLQkJCVR5cGVBZGFwdGVyIHN1cGVyQ2xhc3MgPSBuZXcgVHlwZUFkYXB0ZXIoVHlwZUZhY3RvcnkuY3JlYXRlKGNoZWNrZWRUeXBlLmdldFN1cGVyQ2xhc3NOYW1lKCksIGNoZWNrZWRUeXBlLmdldFR5cGUoKSkpOw0KLQkJCXJldHVybiBpc0ltcGxlbWVudGluZyhzdXBlckNsYXNzLCBjaGVja2VkSW50ZXJmYWNlTmFtZSk7DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUNCi0JICogDQotCSAqIEByZXR1cm4gbm90IDx0dD5udWxsPC90dD4gc3RyaW5nDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKQ0KLQl7DQotCQlyZXR1cm4gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCBuYW1lIGluIHdoaWNoIHRoZSB0eXBlIHJlc2lkZXMuDQotCSAqIA0KLQkgKiBAcmV0dXJuIG5vdCA8dHQ+bnVsbDwvdHQ+IHN0cmluZw0KLQkgKi8NCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpDQotCXsNCi0JCXJldHVybiB0eXBlLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB3cmFwcGVkIElUeXBlLg0KLQkgKiANCi0JICogQHJldHVybiBJVHlwZSBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIGZpbmFsIElUeXBlIGdldFR5cGUoKQ0KLQl7DQotCQlyZXR1cm4gdHlwZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCXJldHVybiB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmhhc2hDb2RlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKG9iai5nZXRDbGFzcygpID09IFR5cGVBZGFwdGVyLmNsYXNzKQ0KLQkJew0KLQkJCXJldHVybiAoZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygoKFR5cGVBZGFwdGVyKSBvYmopLmdldFF1YWxpZmllZE5hbWUoKSkpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgdGhlIHR5cGUgaXMgcHVibGljLg0KLQkgKiANCi0JICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gRmxhZ3MuaXNQdWJsaWModHlwZS5nZXRGbGFncygpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSB0eXBlIGlzIGZpbmFsLg0KLQkgKiANCi0JICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBjbGFzcyBpcyBmaW5hbA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIEZsYWdzLmlzRmluYWwodHlwZS5nZXRGbGFncygpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSB0eXBlIGlzIGFic3RyYWN0Lg0KLQkgKiANCi0JICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBjbGFzcyBpcyBhYnN0cmFjdA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIEZsYWdzLmlzQWJzdHJhY3QodHlwZS5nZXRGbGFncygpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSB0eXBlIGlzIGFuIGludGVyZmFjZS4NCi0JICogDQotCSAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGUgY2xhc3MgaXMgaW50ZXJmYWNlDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIHR5cGUuaXNJbnRlcmZhY2UoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3ZhbGlkYXRpb24vcHJvdmlkZXIvVHlwZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjQ2ODliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnZhbGlkYXRpb24ucHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuUHJpbWl0aXZlVHlwZUhhbmRsZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuVHlwZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgZm9yIElUeXBlIG9iamVjdHMuIENvbnRhaW5zIGNhY2hlIHdpdGggYWxyZWFkeSBmb3VuZCB0eXBlcyBwZXIgcHJvamVjdCB0aGlzIHdheSBtaW5pbWl6aW5nIHRoZSB0aW1lIG5lZWRlZCB0byBvYnRhaW4gYW4gSVR5cGUgaW5zdGFuY2UgZm9yDQotICogY29uY3JlYXRlIHR5cGUuIFJlZ2lzdGVycyBSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lciB0byBsaXN0ZW4gZm9yIGNoYW5nZXMgaW4gcHJvamVjdHMuIElmIHNvbWUgcmVzb3VyY2UgaW4gc29tZSBwcm9qZWN0cyBoYXMgYmVlbiBjaGFuZ2VkIHRoZSBjYWNoZQ0KLSAqIGZvciB0aGlzIHByb2plY3QgaXMgY2xlYW5lZC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFR5cGVGYWN0b3J5DQotew0KLQkvKioNCi0JICogQW5hbHlzZWQgdHlwZXMgY2FjaGUuDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBNYXA8U3RyaW5nLCBJVHlwZT4+IHR5cGVzQ2FjaGUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgTWFwPFN0cmluZywgSVR5cGU+PigpOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBUeXBlQ2FjaGUgY2FjaGUgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBUeXBlUHJveHkgaW5zdGFuY2UgZm9yIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGZvciB0aGUgcHJvamVjdCB3aXRoIG5hbWUgPGNvZGU+cHJvamVjdE5hbWU8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgSVR5cGUgaW4gY2FzZSB0eXBlIGhhcyBiZWVuIGZvdW5kDQotCSAqIEB0aHJvd3MgVHlwZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGlmIHR5cGUgd2l0aCBmdWxseSBxdWFsaWZpZWQgbmFtZSA8dHQ+cXVhbGlmaWVkTmFtZTwvdHQ+IGlzIG5vdCBmb3VuZA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVHlwZSBjcmVhdGUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOw0KLQ0KLQkJcmV0dXJuIGNyZWF0ZShKYXZhQ29yZS5jcmVhdGUocHJvamVjdCksIHF1YWxpZmllZE5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBGaW5kcyBJVHlwZSBvYmplY3QgZm9yIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGZvciB0aGUgcHJvamVjdCBpbiB3aGljaCA8Y29kZT50eXBlPC9jb2RlPiByZXNpZGVzLg0KLQkgKiANCi0JICogQHBhcmFtIHF1YWxpZmllZE5hbWUNCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiBJVHlwZSBpbiBjYXNlIHR5cGUgaGFzIGJlZW4gZm91bmQNCi0JICogQHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgdHlwZSB3aXRoIGZ1bGx5IHF1YWxpZmllZCBuYW1lIDx0dD5xdWFsaWZpZWROYW1lPC90dD4gaXMgbm90IGZvdW5kDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElUeXBlIGNyZWF0ZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwgSVR5cGUgdHlwZSkgdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBjcmVhdGUodHlwZS5nZXRKYXZhUHJvamVjdCgpLCBxdWFsaWZpZWROYW1lKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRmluZHMgSVR5cGUgb2JqZWN0IGZvciA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiB0eXBlIGluIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPiBwcm9qZWN0LiBPbiBmaXJzdCBzdGVwcyB0cmllcyB0byBmaW5kIHRoaXMgdHlwZSBpbiBjYWNoZQ0KLQkgKiBhbmQgaWYgbm90IGZvdW5kIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkLg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFQcm9qZWN0DQotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgSVR5cGUgaW4gY2FzZSB0eXBlIGhhcyBiZWVuIGZvdW5kDQotCSAqIEB0aHJvd3MgVHlwZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGlmIHR5cGUgd2l0aCBmdWxseSBxdWFsaWZpZWQgbmFtZSA8dHQ+cXVhbGlmaWVkTmFtZTwvdHQ+IGlzIG5vdCBmb3VuZA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGUgY3JlYXRlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgbG9jYWxRdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZTsNCi0NCi0JCWlmIChQcmltaXRpdmVUeXBlSGFuZGxlci5pc0FycmF5VHlwZShsb2NhbFF1YWxpZmllZE5hbWUpKQ0KLQkJew0KLQkJCWxvY2FsUXVhbGlmaWVkTmFtZSA9IFByaW1pdGl2ZVR5cGVIYW5kbGVyLmdldFR5cGVGcm9tQXJyYXlUeXBlKGxvY2FsUXVhbGlmaWVkTmFtZSk7DQotCQl9DQotDQotCQlpZiAoUHJpbWl0aXZlVHlwZUhhbmRsZXIuaXNKYXZhUHJpbWl0aXZlVHlwZShsb2NhbFF1YWxpZmllZE5hbWUpKQ0KLQkJew0KLQkJCWxvY2FsUXVhbGlmaWVkTmFtZSA9IFByaW1pdGl2ZVR5cGVIYW5kbGVyLmdldE9iamVjdFR5cGVGb3JQcmltaXRpdmVUeXBlKGxvY2FsUXVhbGlmaWVkTmFtZSk7DQotCQl9DQotDQotCQlpZiAoY2FjaGUgPT0gbnVsbCkNCi0JCXsNCi0JCQljYWNoZSA9IG5ldyBUeXBlQ2FjaGUoKTsNCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihjYWNoZSk7DQotCQl9DQotDQotCQlJVHlwZSB0eXBlID0gY2FjaGUuZmluZFR5cGUobG9jYWxRdWFsaWZpZWROYW1lLCBqYXZhUHJvamVjdCk7DQotCQlpZiAodHlwZSAhPSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiB0eXBlOw0KLQkJfQ0KLQ0KLQkJdHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKGxvY2FsUXVhbGlmaWVkTmFtZSk7DQotCQlpZiAodHlwZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBUeXBlTm90Rm91bmRFeGNlcHRpb24obG9jYWxRdWFsaWZpZWROYW1lKTsNCi0JCX0NCi0NCi0JCWNhY2hlLmFkZFR5cGUobG9jYWxRdWFsaWZpZWROYW1lLCB0eXBlLCBqYXZhUHJvamVjdCk7DQotDQotCQlyZXR1cm4gdHlwZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2FjaGluZyBmdW5jdGlvbmFsaXR5LiBBbGwgdHlwZXMgdGhhdCBoYXZlIGJlZW4gcmV0cmlldmVkIGFyZSBjYWNoZWQuIENhY2hpbmcgaXMgcGVyIHByb2plY3QuIFNlYXJjaCBpcyBleGVjdXRlbiBpbiBmb2xsb3dpbiB3YXk6PGJyPg0KLQkgKiAxLiBTZWFyY2ggZm9yIGNoYWNoZSBmb3IgdGhlIHByb2plY3QuIElmIGNhY2hlIGlzIG5vdCBmb3VuZCBhbiBlbXB0eSBjYWNoZSBpcyBjcmVhdGVkLjxicj4NCi0JICogMi4gVHlwZSBpcyBzZWFyY2hlZCBpbiB0aGUgcHJvamVjdHMgY2FjaGUgYW5kIGlzIHJldHVybmVkLiBJZiBhIHR5cGUgaXMgbm90IGZvdW5kIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLg0KLQkgKiANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZUNhY2hlIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXINCi0Jew0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KQ0KLQkJew0KLQkJCWlmIChldmVudCAhPSBudWxsICYmIGV2ZW50LmdldERlbHRhKCkgIT0gbnVsbCkNCi0JCQl7DQotCQkJCWZvciAoSVJlc291cmNlRGVsdGEgY2hpbGRyZW4gOiBldmVudC5nZXREZWx0YSgpLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCQkJew0KLQkJCQkJSVJlc291cmNlRGVsdGEgckRlbHRhID0gKElSZXNvdXJjZURlbHRhKSBjaGlsZHJlbi5nZXRBZGFwdGVyKElSZXNvdXJjZURlbHRhLmNsYXNzKTsNCi0JCQkJCWlmIChyRGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsICYmIHJEZWx0YS5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSVByb2plY3QpDQotCQkJCQl7DQotCQkJCQkJcmVtb3ZlTWFwRm9yUHJvamVjdChyRGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpDQotCQl7DQotCQkJcmV0dXJuIGdldE1hcEZvclByb2plY3QoamF2YVByb2plY3QpLmdldChxdWFsaWZpZWROYW1lKTsNCi0JCX0NCi0NCi0JCXByb3RlY3RlZCB2b2lkIGFkZFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUsIElUeXBlIHR5cGUsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkNCi0JCXsNCi0JCQlnZXRNYXBGb3JQcm9qZWN0KGphdmFQcm9qZWN0KS5wdXQocXVhbGlmaWVkTmFtZSwgdHlwZSk7DQotCQl9DQotDQotCQlwcml2YXRlIHZvaWQgcmVtb3ZlTWFwRm9yUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpDQotCQl7DQotCQkJdHlwZXNDYWNoZS5yZW1vdmUocHJvamVjdE5hbWUpOw0KLQkJfQ0KLQ0KLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBJVHlwZT4gZ2V0TWFwRm9yUHJvamVjdChJSmF2YVByb2plY3QgamF2YVByb2plY3QpDQotCQl7DQotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsNCi0JCQlNYXA8U3RyaW5nLCBJVHlwZT4gcHJvamVjdFR5cGVzID0gdHlwZXNDYWNoZS5nZXQocHJvamVjdE5hbWUpOw0KLQkJCWlmIChwcm9qZWN0VHlwZXMgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXByb2plY3RUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVR5cGU+KCk7DQotCQkJCXR5cGVzQ2FjaGUucHV0KHByb2plY3ROYW1lLCBwcm9qZWN0VHlwZXMpOw0KLQkJCX0NCi0NCi0JCQlyZXR1cm4gcHJvamVjdFR5cGVzOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlS2V5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3ZhbGlkYXRpb24vcHJvdmlkZXIvVHlwZUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDJhYTQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC52YWxpZGF0aW9uLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLQ0KLS8qKg0KLSAqIFR5cGUga2V5IC0gcmVwcmVzZW50cyB0eXBlIGluIGNvbnRleHQgb2YgcHJvamVjdC4gT3ZlcnJpZGVzIGhhc2hDb2RlKCkgZm9yIHVzYWdlIGluIG1hcHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUeXBlS2V5DQotew0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZTsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvci4NCi0JICogDQotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQ0KLQkgKiBAcGFyYW0gcXVhbGlmaWVkVHlwZU5hbWUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIHNvbWUgb2YgdGhlIHBhcmFtcyBpcyBudWxsLg0KLQkgKi8NCi0JcHVibGljIFR5cGVLZXkoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShwcm9qZWN0TmFtZSwgInByb2plY3ROYW1lIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0ocXVhbGlmaWVkVHlwZU5hbWUsICJxdWFsaWZpZWRUeXBlTmFtZSIpOw0KLQ0KLQkJdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOw0KLQkJdGhpcy5xdWFsaWZpZWRUeXBlTmFtZSA9IHF1YWxpZmllZFR5cGVOYW1lOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIHByb2plY3ROYW1lLmhhc2hDb2RlKCkgKyBxdWFsaWZpZWRUeXBlTmFtZS5oYXNoQ29kZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pDQotCXsNCi0JCWlmIChvIGluc3RhbmNlb2YgVHlwZUtleSkNCi0JCXsNCi0JCQlyZXR1cm4gKChUeXBlS2V5KSBvKS5oYXNoQ29kZSgpID09IGhhc2hDb2RlKCk7DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQW5ub3RhdGlvblNlcmlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUFubm90YXRpb25TZXJpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjOGVlZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQW5ub3RhdGlvblNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotDQotLyoqDQotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBpbnRlbmQgdG8gZG8gc2VyaWFsaXphdGlvbiBmb3IgDQotICogRE9NIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25TZXJpYWxpemVyIA0KLXsNCi0JcHVibGljIHZvaWQgc2F2ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQ29tcGlsYXRpb25Vbml0RmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2Q2NjkwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotDQotLyoqDQotICogSW1wbGVtZW50cyBhIHZpc2l0b3IgcGF0dGVybiBmb3IgdHJhdmVyc2luZyBjb21waWxhdGlvbiB1bml0LiBUaGlzIGludGVyZmFjZSBkb2VzIG5vdCBkZWZpbmUgd2hhdCBzZXQgb2YgY29tcGlsYXRpb24NCi0gKiB1bml0cyB3aWxsIGJlIHRyYXZlcmVzZWQuIFRoaXMgY291bGQgYmUgYSBzaW5nbGUgamF2YSBwcm9qZWN0LCB0aGUgd2hvbGUgd29ya3NwYWNlIG9yIGp1c3QgYSBnaXZlbiBwYWNrYWdlLiBUaGUgc2V0IG9mDQotICogdHJhdmVyc2VkIGNvbXBpbGF0aW9uIHVuaXRzIGlzIGxlZnQgdXAgdG8gdGhlIGltcGxlbWVudGF0aW9uLiBOZXZlcnRoZWxlc3MgYXMgdGhlc2UgY29tcGlsYXRpb24gdW5pdHMgYXJlIGFsd2F5cyBjb250YWluZWQNCi0gKiBpbnNpZGUgYSBqYXZhIHByb2plY3QsIHRoZSA8L2M+SUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIuaGFuZGxlUHJvamVjdChJSmF2YVByb2plY3QpPC9jPiBoYXMgdG8gYmUgY2FsbGVkIGV4YWN0bHkgb25jZSB0bw0KLSAqIG5vdGlmeSB0aGUgaGFuZGxlciBmb3IgZWFjaCBwcm9qZWN0IGJlaW5nIHByb2Nlc3NlZC4gVGhlIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlciB3aWxsIGJlIGZpcnN0IG5vdGlmaWVkIHRoYXQgdGhlIHByb2Nlc3NpbmcNCi0gKiBvZiBnaXZlbiBwcm9qZWN0IGhhcyBiZWdhbiBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBpdCB3aWxsIGJlIG5vdGlmaWVkIGZvciBhbGwgYW5ub3RhdGlvbnMgaW4gdGhpcyBwcm9qZWN0IGRpc2NvdmVyZWQgYnkNCi0gKiB0aGUgZ2l2ZW4gaW1wbGVtZW50YXRpb24uIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElDb21waWxhdGlvblVuaXRGaW5kZXINCi17DQotCS8qKg0KLQkgKiBTdGFydHMgdGhlIHRyYXZlcnNhbCBvZiBjb21waWxhdGlvbiB1bml0cw0KLQkgKiBAcGFyYW0gbW9uaXRvciAtIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIGJlIHVzZWQgZm9yIHRoZSB0cmF2ZXJzYWwuDQotCSAqIEBwYXJhbSBjdUhhbmRsZXIgLSBjb21waWxhdGlvbiB1bml0IGhhbmRsZXIgdG8gYmUgbm90aWZpZWQgZm9yIGEgZ2l2ZW4gcHJvamVjdA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gLSB0aHJvd24gaWYgdW5leHBlY3RlZCBwcm9ibGVtIG9jY3VycmVkIHdoaWxlIHRyYXZlcnNpbmcgYW5ub3RhdGlvbnMNCi0JICovDQotCXB1YmxpYyB2b2lkIGZpbmQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQ29tcGlsYXRpb25Vbml0SGFuZGxlciBjdUhhbmRsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQ29tcGlsYXRpb25Vbml0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQ29tcGlsYXRpb25Vbml0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5M2EzMTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotDQotLyoqDQotICogQSBsaXN0ZW5lciBmb3IgZXZlbnRzIGlzc2V1ZCBieSBhbiA8Yz5JQ29tcGlsYXRpb25Vbml0RmluZGVyPC9jPiBpbnN0YW5jZSBkdXJpbmcgY29tcGlsYXRpb24gdW5pdCB0cmF2ZXJzYWxzDQotICogDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKiANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElDb21waWxhdGlvblVuaXRIYW5kbGVyDQotew0KLQkvKioNCi0JICogY2FsbGVkIGJ5IHRoZSA8Yz57QGxpbmsgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcn08L2M+IGluc3RhbmNlIHdoZW4gaXQgaGFzIHN0YXJ0ZWQgdG8gdHJhdmVyc2UgdGhlIGFubm90YXRpb24gc2V0LiBBbGwgY2FsbHMgdG8gPGM+aGFuZGxlKC4uLik8L2M+DQotCSAqIG1ldGhvZHMgaXMgaW5zaWRlIGEgc3RhcnRlZC1maW5pc2hlZCBibG9jay4NCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0ZWQoKTsNCi0NCi0JLyoqDQotCSAqIGNhbGxlZCBieSB0aGUgPGM+e0BsaW5rIElDb21waWxhdGlvblVuaXRGaW5kZXJ9PC9jPiBpbnN0YW5jZSB3aGVuIGl0IGhhcyBmaW5pc2hlZCB0byB0cmF2ZXJzZSB0aGUgYW5ub3RhdGlvbiBzZXQuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpOw0KLQ0KLQkvKioNCi0JICogQ2FsbGVkIHdoZW4gdGhlIDxjPntAbGluayBJQ29tcGlsYXRpb25Vbml0RmluZGVyfTwvYz4gaW5zdGFuY2UgZm91bmQgYSBjb21waWxhdGlvbiB1bml0LiBUaGlzIG1ldGhvZCBpcyBhd2xheXMgY2FsbGVkIGFmdGVyIGEgY2FsbCB0byA8Yz57QGxpbmsgI2hhbmRsZShKYXZhUHJvamVjdCkgaGFuZGxlKEphdmFQcm9qZWN0KX08L2M+Lg0KLQkgKiBUaGUgcmVwb3J0ZWQgY29tcGlsYXRpb24gdW5pdCBpcyBndWFyYW50ZWVkIHRvIGJlIGZvdW5kIGluc2lkZSB0aGUgPGM+SmF2YVByb2plY3Q8L2M+IHJlcG9ydGVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8gPGM+e0BsaW5rI2hhbmRsZShKYXZhUHJvamVjdCkgaGFuZGxlKEphdmFQcm9qZWN0KX08L2M+Lg0KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgZm9yIGVhY2ggY29tcGlsYXRpb24gdW5pdA0KLQkgKiANCi0JICogQHBhcmFtIGN1IC0NCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdCBmb3VuZCBieSB0aGUgZmluZGVyDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBoYW5kbGUoSUNvbXBpbGF0aW9uVW5pdCBjdSk7DQotDQotCS8qKg0KLQkgKiBDYWxsZWQgd2hlbiB0aGUgPGM+e0BsaW5rIElDb21waWxhdGlvblVuaXRGaW5kZXJ9PC9jPiBpbnN0YW5jZSBmb3VuZCBhIGphdmEgcHJvamVjdC4gVGhpcyBtZXRob2QgaXMgYWx3YXlzIGNhbGxlZCBiZWZvcmUgdGhlIDxjPntAbGluayAjaGFuZGxlKElDb21waWxhdGlvblVuaXQpfTwvYz4NCi0JICogZm9yIGFueSBjb21waWxhdGlvbiB1bml0IGZvdW5kIGluIHRoaXMgcHJvamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGZvciBlYWNoIGZvdW5kIHByb2plY3QuDQotCSAqIA0KLQkgKiBAcGFyYW0ganByaiAtDQotCSAqICAgICAgICAgICAgdGhlIGphdmEgcHJvamVjdCBmb3VuZCBieSB0aGUgZmluZGVyDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBoYW5kbGUoSUphdmFQcm9qZWN0IGpwcmopOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSU1vZGVsRWxlbWVudFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMDBmYzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSU1vZGVsRWxlbWVudFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXINCi17DQotCXB1YmxpYyBEb21VdGlsIHV0aWwoKTsNCi0JcHVibGljIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGEoKTsJDQotCXB1YmxpYyBJTG9nZ2VyIGxvZ2dlcigpOw0KLQlwdWJsaWMgSURPTSBnZXREb21CZWluZ0xvYWRlZCgpOw0KLQlwdWJsaWMgRG9tRmFjdG9yeSBkb21GYWN0b3J5KCk7CQ0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKTsJDQotCXB1YmxpYyBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSVByb2plY3RTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JUHJvamVjdFNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1YWQ1ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JUHJvamVjdFNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLQ0KLS8qKg0KLSAqIFNwZWNpZmllcyB3aGF0IGphdmEgcHJvamVjdHMgd2lsbCBiZSB0cmF2ZXJzZWQgYnkgYSBnaXZlbiA8Yz5JQ29tcGlsYXRpb25Vbml0RmluZGVyPC9jPiBpbnN0YW5jZS4gSWYgYW55IG9mIHRoZSByZWdpc3RlcmVkDQotICogc2VsZWN0b3JzIGFwcHJvdmVkIHRoZSBwcm9qZWN0IGkuZS4gPGM+SVByb2plY3RTZWxlY3Rvci5hcHByb3ZlKElKYXZhUHJvamVjdCk8L2M+IHJldHVybmVkIHRydWUsIHRoZW4gdGhpcyBwcm9qZWN0IHdpbGwNCi0gKiBiZSB0cmF2ZXJzZWQuIEkuZS4gdGhlIHByb2plY3QgbmVlZHMgdG8gYmUgcmVqZWN0ZWQgYnkgYWxsIHRoZSBzZWxlY3RvcnMgaW4gb3JkZXIgbm90IHRvIGJlIHRyYXZlcnNlZC4NCi0gKiANCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgcmVqZWN0IGEgcHJvamVjdCB0aGF0IGl0IGhhcyBubyBrbm93bGVkZ2UgYWJvdXQuDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2plY3RTZWxlY3Rvcg0KLXsNCi0JLyoqDQotCSAqIEFwcHJvdmVzIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBmb3IgdHJhdmVyc2FsDQotCSAqIEBwYXJhbSBwcmogLSB0aGUgcHJvamVjdCB0byBhcHByb3ZlIG9yIHJlamVjdA0KLQkgKiBAcmV0dXJuIC0gdHJ1ZSBpZiB0aGUgcHJvamVjdCBzaG91bGQgYmUgdHJhdmVyc2VkIGFjY29yZGluZyB0byB0aGlzIHNlbGVjdG9yLCBmYWxzZSBvdGhlcndpc2UuDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiOWQ3N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotLyoqDQotICogQ29udGFpbnMgdXRpbGl0eSBtZXRob2RzIGZvciBjYWxjdWxhdGluZyBkZWZhdWx0IHZhbHVlcyBvZiBzb21lIGF0dHJpYnV0ZXMvcHJvcGVydGllcyBpbiANCi0gKiBhbm5vdGF0aW9ucyBhbmQgRE9NIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvciANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkcgPSAiYXJnIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOID0gInJldHVybiI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1BPTlNFID0gIlJlc3BvbnNlIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIFNPQVBCaW5kaW5nU3R5bGUuIElmIHRoZXJlIGlzIGEgdmFsdWUgZm9yIHN0eWxlIGF0dHJpYnV0ZSBpbiA8Y29kZT5zYkFubm90YXRpb248L2NvZGU+IHJldHVybnMgdGhhdCB2YWx1ZQ0KLQkgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUuDQotCSAqIEBwYXJhbSBzYkFubm90YXRpb24NCi0JICogQHJldHVybiB0aGUgc3R5bGUNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1N0eWxlIGRlZmluZVNCU3R5bGUoZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gc2JBbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBzYkFubm90YXRpb24hPW51bGwgPyBzYkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5TVFlMRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmICh2YWx1ZSE9bnVsbCAmJiBTQkFubm90YXRpb25GZWF0dXJlcy5TQl9TVFlMRV9SUEMuZW5kc1dpdGgodmFsdWUudHJpbSgpKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1N0eWxlLlJQQzsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQ7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBTT0FQQmluZGluZ1VzZS4gSWYgdGhlcmUgaXMgYSB2YWx1ZSBmb3IgdXNlIGF0dHJpYnV0ZSBpbiA8Y29kZT5zYkFubm90YXRpb248L2NvZGU+IHJldHVybnMgdGhhdCB2YWx1ZQ0KLQkgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUuDQotCSAqIEBwYXJhbSBzYkFubm90YXRpb24NCi0JICogQHJldHVybiB0aGUgc3R5bGUNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1VzZSBkZWZpbmVTQlVzZShmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBzYkFubm90YXRpb24pIHsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IHNiQW5ub3RhdGlvbiE9bnVsbCA/IHNiQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlVTRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmKHZhbHVlIT1udWxsICYmIFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1VTRV9FTkNPREVELmVuZHNXaXRoKHZhbHVlLnRyaW0oKSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdVc2UuRU5DT0RFRDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIFNPQVBCaW5kaW5nVXNlLkxJVEVSQUw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBTT0FQQmluZGluZ1VzZS4gSWYgdGhlcmUgaXMgYSB2YWx1ZSBmb3IgcGFyYW1ldGVyU3R5bGUgYXR0cmlidXRlIGluIDxjb2RlPnNiQW5ub3RhdGlvbjwvY29kZT4gDQotCSAqIHJldHVybnMgdGhhdCB2YWx1ZSBvdGhlcndpc2UgcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUuDQotCSAqIEBwYXJhbSBzYkFubm90YXRpb24NCi0JICogQHJldHVybiB0aGUgc3R5bGUNCi0JICovCQ0KLQlwdWJsaWMgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBkZWZpbmVTQlBhcmFtZXRlclN0eWxlKGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHNiQW5ub3RhdGlvbikNCi0Jew0KLQkJZmluYWwgU3RyaW5nIHZhbHVlID0gc2JBbm5vdGF0aW9uIT1udWxsID8gc2JBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoU0JBbm5vdGF0aW9uRmVhdHVyZXMuUEFSQU1FVEVSX1NUWUxFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYgKHZhbHVlIT1udWxsICYmIFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1BBUkFNRVRFUl9TVFlMRV9CQVJFLmVuZHNXaXRoKHZhbHVlLnRyaW0oKSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOwkJDQotCX0JDQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGFyYW1ldGVyIG5hbWUgYWNjb3JkaW5nIHRvIEpTUi0xODEgcG9pbnQgNC40IC0gV2ViUGFyYW0gbmFtZQ0KLQkgKiBhdHRyaWJ1dGUgIA0KLQkgKiBAcGFyYW0gd2ViTWV0aG9kIHRoZSBtZXRob2QgaG9sZGluZyB0aGUgcGFyYW1ldGVyDQotCSAqIEBwYXJhbSBwYXJhbVBvc2l0aW9uIHRoZSBwYXJhbWV0ZXIgcG9zaXRpb24gaW4gbWV0aG9kIGFyZ3VtZW50cyBsaXN0IHN0YXJ0aW5nIHdpdGggMA0KLQkgKiBAcmV0dXJuIGNhbGN1bGF0ZWQgbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjYWxjV2ViUGFyYW1EZWZhdWx0TmFtZShmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgaW50IHBhcmFtUG9zaXRpb24pDQotCXsNCi0JCWlmKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQgJiYNCi0JCSAgIHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk9PVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSkgDQotCQl7DQotCQkJcmV0dXJuIHdlYk1ldGhvZC5nZXROYW1lKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBBUkcgKyBwYXJhbVBvc2l0aW9uOyANCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIHBhcmFtZXRlciBuYW1lIGFjY29yZGluZyB0byBKU1ItMTgxIHBvaW50IDQuNCAtIFdlYlBhcmFtIG5hbWUNCi0JICogYXR0cmlidXRlIA0KLQkgKiBAcGFyYW0gd2ViUGFyYW0NCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjYWxjV2ViUGFyYW1EZWZhdWx0TmFtZShmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pIA0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsNCi0JCXJldHVybiBjYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJNZXRob2QsIGdldFBhcmFtUG9zaXRpb24od2ViTWV0aG9kLCB3ZWJQYXJhbSkpOwkJDQotCX0NCi0JDQotCS8qKg0KLQkgKiBDYWxjdWxhdGVzIHRoZSBwb3NpdGlvbiBvZiA8Y29kZT5wYXJhbTwvY29kZT4gaW4gPGNvZGU+bWV0aG9kPC9jb2RlPiBzaWduYXR1cmUgc3RhcnRpbmcgZnJvbSAwDQotCSAqIEBwYXJhbSB3ZWJNZXRob2QNCi0JICogQHBhcmFtIHBhcmFtDQotCSAqIEByZXR1cm4gdGhlIHBhcmFtIHBvc2l0aW9uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+d2ViTWV0aG9kPC9jb2RlPiBkb2VzIG5vdCBjb250YWluIDxjb2RlPnBhcmFtPC9jb2RlPg0KLQkgKi8NCi0JcHJvdGVjdGVkIGludCBnZXRQYXJhbVBvc2l0aW9uKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBmaW5hbCBJV2ViUGFyYW0gcGFyYW0pDQotCXsNCi0JCWludCBwb3NpdGlvbiA9IDA7DQotCQlmb3IgKElXZWJQYXJhbSB3ZWJQYXJhbSA6IHdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkpIA0KLQkJew0KLQkJCWlmICh3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygicmV0dXJuIikpIHsvLyROT04tTkxTLTEkDQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlpZiAod2ViUGFyYW09PXBhcmFtKSB7DQotCQkJCXJldHVybiBwb3NpdGlvbjsNCi0JCQl9DQotCQkJDQotCQkJcG9zaXRpb24rKzsNCi0JCX0NCi0JCQ0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUGFyYW1ldGVyWyIgKyBwYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpICsgIl0gd2FzIG5vdCBmb3VuZCBpbiBtZXRob2QgWyIgKyB3ZWJNZXRob2QuZ2V0SW1wbGVtZW50YXRpb24oKSArICJdIik7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkDQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjQgLSBXZWJQYXJhbSB0YXJnZXQgTlMuDQotCSAqIEBwYXJhbSB3ZWJNZXRob2QgdGhlIG1ldGhvZCBob2xkaW5nIHRoZSBwYXJhbWV0ZXINCi0JICogQHBhcmFtIHdlYlBhcmFtDQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCBOUw0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMoZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJaWYod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCAmJg0KLQkJICAgd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKT09U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEICYmDQotCQkgICAhd2ViUGFyYW0uaXNIZWFkZXIoKSkgDQotCQl7DQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuICgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl3ZWJNZXRob2QuZUNvbnRhaW5lcigpKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQga2luZCBmb3Igd2ViIHBhcmFtZXRlcnMgLSByZXR1cm5zIHtAbGluayBXZWJQYXJhbUtpbmQjSU59DQotCSAqLw0KLQlwdWJsaWMgV2ViUGFyYW1LaW5kIGdldERlZmF1bHRQYXJhbUtpbmQoKSB7DQotCQlyZXR1cm4gV2ViUGFyYW1LaW5kLklOOwkJDQotCX0NCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIGZhbHNlIGJlY2F1c2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIFdlYlBhcmFtKGhlYWRlcikgaXMgZmFsc2UNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRQYXJhbUluSGVkYWVyKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGFyYW1ldGVyIG5hbWUgYWNjb3JkaW5nIHRvIEpTUi0xODEgcG9pbnQgNC41IC0gV2ViUmVzdWx0IG5hbWUuDQotCSAqIEBwYXJhbSB3ZWJNZXRob2QgdGhlIG1ldGhvZCBob2xkaW5nIHRoZSBwYXJhbWV0ZXINCi0JICogQHJldHVybiBjYWxjdWxhdGVkIG5hbWUNCi0JICovCQ0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJSZXN1bHREZWZhdWx0TmFtZShmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkgDQotCXsNCi0JCWlmKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQgJiYgDQotCQkgICB3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpDQotCQl7DQotCQkJcmV0dXJuIHdlYk1ldGhvZC5nZXROYW1lKCkgKyBSRVNQT05TRTsgDQotCQl9DQotCQkNCi0JCXJldHVybiBSRVRVUk47DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KYXhXc1dvcmtzcGFjZVJlc291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA5NWNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLlNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMuSW5pdGlhbE1vZGVsU3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYy5PbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLkZhY2V0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHMuSUZhY2V0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBSZXByZXNlbnRzIHRoZSByZXNvdXJjZSBmb3IgSkFYLVdTIHdlYiBzZXJ2aWNlIERPTSBtb2RlbC4gVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbG9hZGluZyB0aGUgDQotICogbW9kZWwuIEl0IGlzIGNhcGFibGUgdG8gdXNlIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yfSB0byB0cmFjayBwcm9ncmVzcyBhbmQgY2FuY2VsIHJlcXVlc3RzLg0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgZXh0ZW5kcyBOb25TdHJlYW1SZXNvdXJjZQ0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhOw0KLQlwcml2YXRlIGZpbmFsIE9uRXZlbnRNb2RlbFN5bmNocm9uaXplciBtb2RlbFN5bmNocm9uaXplcjsNCi0JcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemVyQWRhcHRlckZhY3Rvcnkgc2VyaWFsaXplckZhY3Rvcnk7IA0KLQ0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsNCi0JDQotCXByaXZhdGUgYm9vbGVhbiBzYXZlRW5hYmxlZDsNCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRDbmFjZWxlZDsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSBqYXZhTW9kZWwNCi0JICovDQotCXB1YmxpYyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsKQ0KLQl7DQotCQl0aGlzLmphdmFNb2RlbCA9IGphdmFNb2RlbDsNCi0JCXNlcnZpY2VEYXRhID0gbmV3IFNlcnZpY2VNb2RlbERhdGEoKTsNCi0JCW1vZGVsU3luY2hyb25pemVyID0gbmV3IE9uRXZlbnRNb2RlbFN5bmNocm9uaXplcih0aGlzLCBzZXJ2aWNlRGF0YSk7DQotCQlzYXZlRW5hYmxlZCA9IHRydWU7DQotCQlzZXJpYWxpemVyRmFjdG9yeSA9IG5ldyBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkodGhpcyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldCBwcm9ncmVzcyBtb25pdG9yIGluIGNhc2UgdGhlIHByb2Nlc3NpbmcgcHJvZ3Jlc3Mgc2hvdWxkIGJlIHRyYWNrZWQgYW5kDQotCSAqIGFsc28gaW4gY2FzZSBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBwcm9jZXNzaW5nIGNhbiBiZSBjYW5jZWxlZCANCi0JICogQHBhcmFtIHBtIHRoZSBtb25pdG9yIC0gY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBwbSkNCi0Jew0KLQkJdGhpcy5tb25pdG9yID0gcG07DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIGxvYWRlZCBET00gaW4gY2FzZSBpdCBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBpbiBjYXNlIGxvYWRpbmcgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgYXQgYWxsIG9yIGluIGNhc2UgbG9hZGluZyBoYXMgYmVlbiBjYW5jZWxlZC4gVG8gY2hlY2sgaWYgdGhlDQotCSAqIGxvYWRpbmcgaGFzIGJlZW4gY2FuY2VsZWQgY2FsbCBpc0xvYWRpbmdDYW5jZWxlZCgpLg0KLQkgKi8NCi0JcHVibGljIElET00gZ2V0RE9NKCkNCi0Jew0KLQkJaWYgKGdldENvbnRlbnRzKCkuc2l6ZSgpID09IDApIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIChJRE9NKSBnZXRDb250ZW50cygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkcyBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byBKYXZhIGVsZW1lbnRzIGluIG9yZGVyIHRvIGtlZXAgdGhlIG1vZGVsIGluIHN5bmMNCi0JICogd2l0aCB0aGVzZSBjaGFuZ2VzDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydFN5bmNocm9uaXppbmcoKQ0KLQl7DQotCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKG1vZGVsU3luY2hyb25pemVyLCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfUkVDT05DSUxFIHwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gSmF2YSBlbGVtZW50cy4gS2VlcCBpbiBtaW5kIHRoYXQgYWZ0ZXIgY2FsbGluZw0KLQkgKiB0aGlzIG1ldGhvZCBjaGFuZ2VzIGluIGphdmEgZWxlbWVudHMgd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIERPTSBtb2RlbA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcFN5bmNocm9uaXppbmcoKQ0KLQl7DQotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKG1vZGVsU3luY2hyb25pemVyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbG9nZ2VyIHRvIHVzZSB3aGVuIHNvbWUgZXZlbnQgbmVlZHMgdG8gYmUgbG9nZ2VkDQotCSAqLw0KLQlwdWJsaWMgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgamF2YSBtb2RlbA0KLQkgKi8NCi0JcHVibGljIElKYXZhTW9kZWwgamF2YU1vZGVsKCkNCi0Jew0KLQkJcmV0dXJuIGphdmFNb2RlbDsNCi0JfQkNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIGRvTG9hZChmaW5hbCBNYXA8PywgPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWxvYWRDbmFjZWxlZCA9IGZhbHNlOw0KLQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOw0KLQ0KLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpDQotCQl7DQotCQkJcHVibGljIHZvaWQgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JCQl7DQotCQkJCXRyeSANCi0JCQkJewkJDQotCQkJCQluZXcgSW5pdGlhbE1vZGVsU3luY2hyb25pemVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UudGhpcywgc2VydmljZURhdGEpLmxvYWQob3B0aW9ucywgc3ViTW9uaXRvcik7DQotCQkJCX0gDQotCQkJCWNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7DQotCQkJCQlsb2FkQ25hY2VsZWQgPSB0cnVlOw0KLQkJCQkJbG9nZ2VyKCkubG9nRXJyb3IoIkpBWCBXUyBXZWIgU2VydmljZXMgRE9NIGxvYWRpbmcgaGFzIGJlZW4gY2FuY2VsZWQgYnkgdGhlIHVzZXIsIHNvbWUgSkFYIFdTIFdlYiBTZXJ2aWNlcyBmdW5jdGlvbmFsaXRpZXMgd29uJ3QgYmUgYXZhaWxhYmxlIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCX0NCi0JCX07DQotCQkNCi0JCXRyeSB7DQotCQkJamF2YU1vZGVsKCkuZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBtb25pdG9yKTsNCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCXRocm93IG5ldyBJT1dyYXBwZWRFeGNlcHRpb24oY2UpOw0KLQkJfQ0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlKE1hcDw/LCA/PiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24Jew0KLQkJLy8gbm8gcHJvY2Vzc2luZyBuZWVkZWQNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgZ2V0U3luY2hyb25pemluZ0xpc3RlbmVyKCkgew0KLQkJcmV0dXJuIG1vZGVsU3luY2hyb25pemVyOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBjb21waWxhdGlvbiB1bml0IGZpbmRlciB0aGF0IGNyYXdscyB0aHJvdWdoIGphdmFNb2RlbCBhbmQgY2FsbHMgDQotCSAqIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlciB0byBwcm9jZXNzIGF2YWlsYWJsZSBDVSdzIA0KLQkgKiBAcGFyYW0gak1vZGVsDQotCSAqIEBwYXJhbSBwcm9qZWN0U2VsZWN0b3JzDQotCSAqIEByZXR1cm4gbm9uIDxjb2RlPm51bGw8L2NvZGU+IHtAbGluayBJQ29tcGlsYXRpb25Vbml0RmluZGVyfSBpbnN0YW5jZSANCi0JICovDQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0RmluZGVyIG5ld0NvbXBpbGF0aW9uVW5pdEZpbmRlcihmaW5hbCBJSmF2YU1vZGVsIGpNb2RlbCwgZmluYWwgSVByb2plY3RTZWxlY3RvcltdIHByb2plY3RTZWxlY3RvcnMpDQotCXsNCi0JCXJldHVybiBuZXcgV29ya3NwYWNlQ1VGaW5kZXIoak1vZGVsLCBwcm9qZWN0U2VsZWN0b3JzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQXBwcm92ZXMgdGhhdCA8Y29kZT5wcmo8L2NvZGU+IGlzIEpBWC1XUyB3ZWIgc2VydmljZSBlbmFibGVkIA0KLQkgKiBAcGFyYW0gcHJqDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSB0aGlzIHByb2plY3QgbWlnaHQgY29udGFpbiBKQVgtV1Mgd2ViIHNlcnZpY2VzDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlUHJvamVjdChmaW5hbCBJSmF2YVByb2plY3QgcHJqKQ0KLQl7DQotCQlmaW5hbCBJRmFjZXRVdGlscyBmYWNldFV0aWxzID0gbmV3IEZhY2V0VXRpbHMoKTsNCi0JCXRyeSB7DQotCQkJcmV0dXJuIGZhY2V0VXRpbHMuaGFzRmFjZXRXaXRoVmVyc2lvbihwcmouZ2V0UHJvamVjdCgpLCBGYWNldFV0aWxzLkVKQl8zMF9GQUNFVF9WRVJTSU9OLCBGYWNldFV0aWxzLkVKQl8zMF9GQUNFVF9JRCwgdHJ1ZSkNCi0JCQkJfHwgZmFjZXRVdGlscy5oYXNGYWNldFdpdGhWZXJzaW9uKHByai5nZXRQcm9qZWN0KCksIEZhY2V0VXRpbHMuV0VCXzI1X0ZBQ0VUX1ZFUlNJT04sIEZhY2V0VXRpbHMuV0VCXzI1X0ZBQ0VUX0lELCB0cnVlKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpDQotCQl7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuYWJsZSB0byByZWFkIGZhY2V0IG9uIHByb2plY3QgIiArIHByai5nZXRFbGVtZW50TmFtZSgpICsgIi4gQW55IFdlYiBTZXJ2aWNlIGVsZW1lbnRzIGluIHRoaXMgcHJvamVjdCB3aWxsIG5vdCBiZSBzaG93biBpbiB0aGUgbmF2aWdhdGlvbiB0cmVlIiwgY2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgSUFubm90YXRpb25JbnNwZWN0b3J9IGZvciA8Y29kZT50eXBlPC9jb2RlPg0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAcmV0dXJuIG5vbiA8Y29kZT5udWxsPC9jb2RlPiBpbnNwZWN0b3INCi0JICovDQotCXB1YmxpYyBJQW5ub3RhdGlvbkluc3BlY3RvciBuZXdBbm5vdGF0aW9uSW5zcGVjdG9yKGZpbmFsIElUeXBlIHR5cGUpDQotCXsNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIG5vbiBlbXB0eSBhcnJheSBvZiBwcm9qZWN0cyBzZWxlY3RvcnMgcmVzcG9uc2libGUgZm9yIGZpbHRlcmluZyBwcm9jZXNzZWQgcHJvamVjdHMgDQotCSAqLw0KLQlwdWJsaWMgSVByb2plY3RTZWxlY3RvcltdIGdldFByb2plY3RTZWxlY3RvcnMoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IElQcm9qZWN0U2VsZWN0b3JbXSB7IG5ldyBJUHJvamVjdFNlbGVjdG9yKCkNCi0JCXsNCi0JCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopDQotCQkJew0KLQkJCQlyZXR1cm4gYXBwcm92ZVByb2plY3QocHJqKTsNCi0JCQl9DQotCQl9IH07DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHNlcmlhbGl6ZXIgZmFjdG9yeSB1c2VkIHRvIGFkYXB0IERPTSBvYmplY3RzIHdpdGggc2VyaWFsaXplciBhZGFwdGVycyAgDQotCSAqLw0KLQlwdWJsaWMgU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5IGdldFNlcmlhbGl6ZXJGYWN0b3J5KCkgew0KLQkJcmV0dXJuIHNlcmlhbGl6ZXJGYWN0b3J5Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzYXZpbmcgaXMgZW5hYmxlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlRW5hYmxlZCgpIHsNCi0JCXJldHVybiBzYXZlRW5hYmxlZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogY2FsbCB0aGlzIG1ldGhvZCB0byBlbmFibGUgc2F2aW5nIG9mIG1vZGVsIG9iamVjdHMgdG8gdW5kZXJseWluZyByZXNvdXJjZXMNCi0JICovDQotCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBlbmFibGVTYXZpbmcoKSB7DQotCQl0aGlzLnNhdmVFbmFibGVkID0gdHJ1ZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIGNhbGwgdGhpcyBtZXRob2QgdG8gZGlzYWJsZSBzYXZpbmcgb2YgbW9kZWwgb2JqZWN0cyB0byB1bmRlcmx5aW5nIHJlc291cmNlcw0KLQkgKi8NCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGRpc2FibGVTYXZpbmcoKSB7DQotCQl0aGlzLnNhdmVFbmFibGVkID0gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIGxvYWQgb2YgRE9NIG1vZGVsIGhhcyBiZWVuIGNhbmNlbGVkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDbmFjZWxlZCgpIHsNCi0JCXJldHVybiBsb2FkQ25hY2VsZWQ7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBIb2xkcyBtb2RlbCBkYXRhIGhlbHBmdWwgaW4gbW9kZWwgcHJvY2Vzc2luZw0KLQkgKi8NCi0JcHVibGljIGNsYXNzIFNlcnZpY2VNb2RlbERhdGENCi0Jew0KLQkJcHJpdmF0ZSBNYXA8SVdlYlNlcnZpY2UsIFN0cmluZz4gd3Myc2VpID0gbmV3IEhhc2hNYXA8SVdlYlNlcnZpY2UsIFN0cmluZz4oKTsNCi0NCi0JCXByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxJV2ViU2VydmljZT4+IHNlaTJ3cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxJV2ViU2VydmljZT4+KCk7DQotDQotCQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248SUNvbXBpbGF0aW9uVW5pdD4+IHR5cGUyaW5oZXJpdGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+PigpOw0KLQ0KLQkJcHVibGljIHZvaWQgbWFwKElXZWJTZXJ2aWNlIHdzLCBTdHJpbmcgc2VpSW1wbCkNCi0JCXsNCi0JCQl3czJzZWkucHV0KHdzLCBzZWlJbXBsKTsNCi0JCQlnZXRJbXBsZW1lbnRpbmdXcyhzZWlJbXBsKS5hZGQod3MpOw0KLQkJfQ0KLQ0KLQkJU3RyaW5nIGdldFNlaUltcGwoSVdlYlNlcnZpY2Ugd3MpDQotCQl7DQotCQkJcmV0dXJuIHdzMnNlaS5nZXQod3MpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIENvbGxlY3Rpb248SVdlYlNlcnZpY2U+IGdldEltcGxlbWVudGluZ1dzKFN0cmluZyBzZWlJbWwpDQotCQl7DQotCQkJQ29sbGVjdGlvbjxJV2ViU2VydmljZT4gd3NzID0gc2VpMndzLmdldChzZWlJbWwpOw0KLQkJCWlmICh3c3MgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXdzcyA9IG5ldyBBcnJheUxpc3Q8SVdlYlNlcnZpY2U+KCk7DQotCQkJCXNlaTJ3cy5wdXQoc2VpSW1sLCB3c3MpOw0KLQkJCX0NCi0JCQlyZXR1cm4gd3NzOw0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgdW5tYXAoSVdlYlNlcnZpY2Ugd3MpDQotCQl7DQotCQkJZmluYWwgU3RyaW5nIHNlaSA9IHdzMnNlaS5yZW1vdmUod3MpOw0KLQkJCWZpbmFsIENvbGxlY3Rpb248SVdlYlNlcnZpY2U+IGltcGxlbWVudGluZ1dlYlNlcnZpY2VzID0gZ2V0SW1wbGVtZW50aW5nV3Moc2VpKTsNCi0JCQlpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcy5yZW1vdmUod3MpOw0KLQkJCWlmIChpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcy5zaXplKCkgPT0gMCkNCi0JCQl7DQotCQkJCXNlaTJ3cy5yZW1vdmUoc2VpKTsNCi0JCQl9DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCByZWNvcmRIaWVyYXJjaHkoU3RyaW5nIGZxTmFtZSwgQ29sbGVjdGlvbjxJQ29tcGlsYXRpb25Vbml0PiBpbmhlcml0ZWRUeXBlcykNCi0JCXsNCi0JCQl0eXBlMmluaGVyaXRlZC5wdXQoZnFOYW1lLCBpbmhlcml0ZWRUeXBlcyk7DQotCQl9DQotDQotCQkvKioNCi0JCSAqIEBwYXJhbSBmcU5hbWUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lDQotCQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgY2xhc3NlcyB0aGF0IGFyZSBzdXBlciBmb3IgY2xhc3MgPGNvZGU+ZnFOYW1lPC9jb2RlPg0KLQkJICovDQotCQlwdWJsaWMgQ29sbGVjdGlvbjxJQ29tcGlsYXRpb25Vbml0PiBnZXRIaWVyYXJjaHkoU3RyaW5nIGZxTmFtZSkNCi0JCXsNCi0JCQlyZXR1cm4gdHlwZTJpbmhlcml0ZWQuZ2V0KGZxTmFtZSk7DQotCQl9DQotDQotCQkvKioNCi0JCSAqIENsZWFycyByZWNvcmRlciBoaWVyYXJjaHkgZm9yIGNsYXNzIHdpdGggRlFOYW1lIDxjb2RlPmZxTmFtZTwvY29kZT4NCi0JCSAqIEBwYXJhbSBmcU5hbWUNCi0JCSAqLw0KLQkJcHVibGljIHZvaWQgY2xlYXJIaWVyYXJjaHkoU3RyaW5nIGZxTmFtZSkNCi0JCXsNCi0JCQl0eXBlMmluaGVyaXRlZC5yZW1vdmUoZnFOYW1lKTsNCi0JCX0NCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0plZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZjEyZDJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1wdWJsaWMgY2xhc3MgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbiBpbXBsZW1lbnRzIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24NCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uamVlNSI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JcHJpdmF0ZSBMaXN0PElXc0RvbUxvYWRMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJV3NEb21Mb2FkTGlzdGVuZXI+KCk7DQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB3b3Jrc3BhY2VSZXNvdXJjZTsNCi0JcHJpdmF0ZSBib29sZWFuIGZpbmlzaGVkOw0KLQlwcml2YXRlIGJvb2xlYW4gc3RhcnRlZDsNCi0NCi0JcHVibGljIHZvaWQgY3JlYXRlRE9NKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbg0KLQl7DQotCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmJlZ2luUnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBtb25pdG9yKTsNCi0JCXRyeSB7DQotCQkJaWYgKHdvcmtzcGFjZVJlc291cmNlID09IG51bGwgfHwgd29ya3NwYWNlUmVzb3VyY2UuaXNMb2FkQ25hY2VsZWQoKSkgewkJCQ0KLQkJCQlwZXJmb3JtTG9hZChtb25pdG9yKTsNCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuZW5kUnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybUxvYWQoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIA0KLQl7DQotCQl3b3Jrc3BhY2VSZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKCk7DQotCQl3b3Jrc3BhY2VSZXNvdXJjZS5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7DQotCQl0cnkgew0KLQkJCXN0YXJ0ZWQoKTsNCi0JCQl3b3Jrc3BhY2VSZXNvdXJjZS5sb2FkKG51bGwpOw0KLQkJCWlmICh3b3Jrc3BhY2VSZXNvdXJjZS5pc0xvYWRDbmFjZWxlZCgpKSB7DQotCQkJCXRocm93IGNyZWF0ZUNhbmNlbGVkRXhjZXB0aW9uKCk7DQotCQkJfQ0KLQkJfSBmaW5hbGx5IHsNCi0JCQlmaW5pc2hlZCgpOw0KLQkJfQ0KLQkJDQotCQl3b3Jrc3BhY2VSZXNvdXJjZS5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSURPTSBnZXRET00oKSB0aHJvd3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHdvcmtzcGFjZVJlc291cmNlID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJaWYgKHdvcmtzcGFjZVJlc291cmNlLmlzTG9hZENuYWNlbGVkKCkpIHsNCi0JCQl0aHJvdyBjcmVhdGVDYW5jZWxlZEV4Y2VwdGlvbigpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd29ya3NwYWNlUmVzb3VyY2UuZ2V0RE9NKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGFkZExvYWRMaXN0ZW5lcihJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIpIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShsaXN0ZW5lciwgImxpc3RlbmVyIik7Ly8kTk9OLU5MUy0xJA0KLQkJDQotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgew0KLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOw0KLQkJfQ0KLQkJDQotCQlpZiAoc3RhcnRlZCkgew0KLQkJCWxpc3RlbmVyLnN0YXJ0ZWQoKTsJCQkNCi0JCX0NCi0JCQ0KLQkJaWYgKGZpbmlzaGVkKSB7DQotCQkJbGlzdGVuZXIuZmluaXNoZWQoKTsJCQkNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKGxpc3RlbmVyLCAibGlzdGVuZXIiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBJSmF2YU1vZGVsIGphdmFNb2RlbCgpIHsNCi0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIGNyZWF0ZVJlc291cmNlKCkgeyANCi0JCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwoKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkKCkgDQotCXsNCi0JCWZpbmlzaGVkID0gdHJ1ZTsNCi0JCWZvciAoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXIuZmluaXNoZWQoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydGVkKCkgDQotCXsNCi0JCXN0YXJ0ZWQgPSB0cnVlOw0KLQkJZmluaXNoZWQgPSBmYWxzZTsNCi0JCWZvciAoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXIuc3RhcnRlZCgpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGNyZWF0ZUNhbmNlbGVkRXhjZXB0aW9uKCkgew0KLQkJcmV0dXJuIG5ldyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbigiSkFYLVdTIERPTSBsb2FkaW5nIGNhbmNlbGVkIiwgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuV29ya3NwYWNlQ1VGaW5kZXJfTE9BRElOR19DQU5DRUxFRCk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL05vblN0cmVhbVJlc291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL05vblN0cmVhbVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmNmE1YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9Ob25TdHJlYW1SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGw7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vblN0cmVhbVJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2VJbXBsIHsNCi0NCi0JLyoqDQotCSAqIFNpbmNlIHRoaXMgUmVzb3VyY2UgaXMgbm90IHN0cmVhbSBiYXNlZCwgdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4NCi0JICogSWYgY2FsbGVkIGl0IHdpbGwgdGhyb3cgPGM+VW5zdXBwb3J0ZWRFeGNlcHRpb248L2M+DQotCSAqIEBwYXJhbSBhcmcwIC0gaWdub3JyZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlzdXBlci5kb0xvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyBSZXNvdXJjZSBpcyBub3Qgc3RyZWFtIGJhc2VkLCB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLg0KLQkgKiBJZiBjYWxsZWQgaXQgd2lsbCB0aHJvdyA8Yz5VbnN1cHBvcnRlZEV4Y2VwdGlvbjwvYz4NCi0JICogQHBhcmFtIGFyZzAgLSBpZ25vcnJlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gYXJnMCwgTWFwPD8sPz4gYXJnMSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCXN1cGVyLmRvU2F2ZShhcmcwLCBhcmcxKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWxsd2FzeSB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+LiBTdHJlYW1zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcmVzb3VyY2UuDQotCSAqIEByZXR1cm4gbm90aGluZy4gdGhpcyBtZXRob2QgYWxsd2F5cyB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNDb250ZW50WmlwRW50cnkoWmlwRW50cnkgYXJnMCkgew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNpbmNlIHRoaXMgcmVzb3VyY2UgZG9lc24ndCBzdXBwb3J0IHN0cmVhbXMgdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4gQWxsd2FzeSB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+Lg0KLQkgKiBAcmV0dXJuIG5vdGhpbmcuIHRoaXMgbWV0aG9kIGFsbHdheXMgdGhyb3dzIDxjPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBmaW5hbCBaaXBFbnRyeSBuZXdDb250ZW50WmlwRW50cnkoKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFNpbmNlIHRoaXMgcmVzb3VyY2UgZG9lc24ndCBzdXBwb3J0IHN0cmVhbXMgdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4gQWxsd2FzeSB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+Lg0KLQkgKiBAcmV0dXJuIG5vdGhpbmcuIHRoaXMgbWV0aG9kIGFsbHdheXMgdGhyb3dzIDxjPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHVzZVppcCgpIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBsb2FkKE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotDQotCQlpZiAoIWlzTG9hZGVkKCkpIHsNCi0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gc2V0TG9hZGVkKHRydWUpOw0KLQkJCWlzTG9hZGluZyA9IHRydWU7DQotCQkJaWYgKGVycm9ycyAhPSBudWxsKSB7DQotCQkJCWVycm9ycy5jbGVhcigpOw0KLQkJCX0NCi0JCQlpZiAod2FybmluZ3MgIT0gbnVsbCkgew0KLQkJCQl3YXJuaW5ncy5jbGVhcigpOw0KLQkJCX0NCi0JCQl0cnkgew0KLQkJCSAgICBNYXA8Pyw/PiBtZXJnZWRPcHRpb25zID0gbWVyZ2VNYXBzKG9wdGlvbnMsIGRlZmF1bHRMb2FkT3B0aW9ucyk7DQotCQkJCWRvTG9hZChtZXJnZWRPcHRpb25zKTsNCi0JCQl9IGZpbmFsbHkgew0KLQkJCQkNCi0JCQkJaXNMb2FkaW5nID0gZmFsc2U7DQotCQkJCWlmIChub3RpZmljYXRpb24gIT0gbnVsbCkgew0KLQkJCQkJZU5vdGlmeShub3RpZmljYXRpb24pOw0KLQkJCQl9DQotCQkJCXNldE1vZGlmaWVkKGZhbHNlKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDYWxsZWQgdG8gbG9hZCB0aGUgcmVzb3VyY2UgdXNpbmcgbm8gc3RyZWFtcy4NCi0JICoNCi0JICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb25zIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIuIFRoaXMgbWV0b2Qgd2lsbCBpZ25vcmUgYW55IG9wdGlvbnMgdGhhdCBpdCBkb2Vzbid0IHJlY29nbml6ZS4gVGhlIGtleXMgYW5kIHRoZSB2YWx1ZXMgY2FuIGJlIGFyYml0cmFyeSBvYmplY3RzLg0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gdGhyb3duIGlmIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGNvbnRlbnQgb2YgdGhpcyByZXNvdXJjZQ0KLQkgKi8NCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzYXZlKE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCSAgICBpZiAoZXJyb3JzICE9IG51bGwpDQotCSAgICB7DQotCSAgICAgIGVycm9ycy5jbGVhcigpOw0KLQkgICAgfQ0KLQkgICAgaWYgKHdhcm5pbmdzICE9IG51bGwpDQotCSAgICB7DQotCSAgICAgIHdhcm5pbmdzLmNsZWFyKCk7DQotCSAgICB9DQotCSAgICBNYXA8Pyw/PiBtZXJnZWRPcHRpb25zID0gbWVyZ2VNYXBzKG9wdGlvbnMsIGRlZmF1bHRTYXZlT3B0aW9ucyk7DQotCSAgICBkb1NhdmUobWVyZ2VkT3B0aW9ucyk7DQotCSAgICBzZXRNb2RpZmllZChmYWxzZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDYWxsZWQgdG8gc2F2ZSB0aGUgcmVzb3VyY2UgdXNpbmcgbm8gc3RyZWFtcy4NCi0JICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb25zIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIuIFRoaXMgbWV0b2Qgd2lsbCBpZ25vcmUgYW55IG9wdGlvbnMgdGhhdCBpdCBkb2Vzbid0IHJlY29nbml6ZS4gVGhlIGtleXMgYW5kIHRoZSB2YWx1ZXMgY2FuIGJlIGFyYml0cmFyeSBvYmplY3RzLg0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gaWYgcHJvYmxlbSBkdXJpbmcgdGhlIHNhdmluZyBvY2N1cnJlZC4NCi0JICovDQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvU2F2ZShNYXA8Pyw/PiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb247DQotCQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1NCQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1NCQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhODFmYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9TQkFubm90YXRpb25GZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotLyoqDQotICogQ29udGFpbnMgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBuYW1lLCBhdHRyaWJ1dGVzIGFuZCBwb3NzaWJsZSB2YWx1ZXMNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNCQW5ub3RhdGlvbkZlYXR1cmVzIA0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfQU5OT1RBVElPTiA9ICJqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9BVFRSSUJVVEUgPSAic3R5bGUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0FUVFJJQlVURSA9ICJ1c2UiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1NUWUxFX0FUVFJJQlVURSA9ICJwYXJhbWV0ZXJTdHlsZSI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfU1RZTEVfRE9DVU1FTlQgCT0gU0JfQU5OT1RBVElPTiArICIuU3R5bGUuRE9DVU1FTlQiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfU1RZTEVfUlBDIAkJPSBTQl9BTk5PVEFUSU9OICsgIi5TT0FQQmluZGluZy5TdHlsZS5SUEMiOy8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCX1VTRV9MSVRFUkFMIAk9IFNCX0FOTk9UQVRJT04gKyAiLlVzZS5MSVRFUkFMIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCX1VTRV9FTkNPREVEIAk9IFNCX0FOTk9UQVRJT04gKyAiLlVzZS5FTkNPREVEIjsvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9QQVJBTUVURVJfU1RZTEVfQkFSRSAJCT0gU0JfQU5OT1RBVElPTiArICIuUGFyYW1ldGVyU3R5bGUuQkFSRSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9QQVJBTUVURVJfU1RZTEVfV1JBUFBFRAk9IFNCX0FOTk9UQVRJT04gKyAiLlBhcmFtZXRlclN0eWxlLldSQVBQRUQiOy8vJE5PTi1OTFMtMSQNCi0JDQotCQ0KLQlwcml2YXRlIFNCQW5ub3RhdGlvbkZlYXR1cmVzKCkgew0KLQkJLy8gbm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XTUFubm90YXRpb25GZWF0dXJlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XTUFubm90YXRpb25GZWF0dXJlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDk4OWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV01Bbm5vdGF0aW9uRmVhdHVyZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXTUFubm90YXRpb25GZWF0dXJlcw0KLXsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fQU5OT1RBVElPTiA9ICJqYXZheC5qd3MuV2ViTWV0aG9kIjsvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNX05BTUVfQVRUUklCVVRFID0gIm9wZXJhdGlvbk5hbWUiOy8vJE5PTi1OTFMtMSQNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fRVhDTFVERURfQVRUUklCVVRFID0gImV4Y2x1ZGUiOy8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBXTUFubm90YXRpb25GZWF0dXJlcygpDQotCXsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dQQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dQQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3YzMyZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XUEFubm90YXRpb25GZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotDQotLyoqDQotICogQ2xhc3MgdGhhdCBob2xkcyBpbmZvcm1hdGlvbiBvbiBqYXZheC5qd3MuV2ViUGFyYW0gYW5ub3RhdGlvbiBuYW1lIGFuZCBhdHRyaWJ1dGUgbmFtZXMuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1maW5hbCBwdWJsaWMgY2xhc3MgV1BBbm5vdGF0aW9uRmVhdHVyZXMgDQotew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUF9BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5XZWJQYXJhbSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFJJQlVURSA9ICJuYW1lIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfTkFNRV9BVFRSSUJVVEUgPSAicGFydE5hbWUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUgPSAidGFyZ2V0TmFtZXNwYWNlIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVfQVRUUklCVVRFID0gIm1vZGUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FUVFJJQlVURSA9ICJoZWFkZXIiOy8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QQVJBTV9NT0RFID0gImphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QQVJBTV9NT0RFX0lOID0gV0VCX1BBUkFNX01PREUgKyAiLklOIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QQVJBTV9NT0RFX09VVCA9IFdFQl9QQVJBTV9NT0RFICsgIi5PVVQiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREVfSU5PVVQgPSBXRUJfUEFSQU1fTU9ERSArICIuSU5PVVQiOy8vJE5PTi1OTFMtMSQNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XU0Fubm90YXRpb25GZWF0dXJlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XU0Fubm90YXRpb25GZWF0dXJlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOWYxNWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV1NBbm5vdGF0aW9uRmVhdHVyZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWZpbmFsIHB1YmxpYyBjbGFzcyBXU0Fubm90YXRpb25GZWF0dXJlcw0KLXsNCi0JcHJpdmF0ZSBXU0Fubm90YXRpb25GZWF0dXJlcygpDQotCXsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5XZWJTZXJ2aWNlIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUklCVVRFID0gIm5hbWUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURSA9ICJlbmRwb2ludEludGVyZmFjZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUVfQVRUUklCVVRFID0gInNlcnZpY2VOYW1lIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTE9DQVRJT05fQVRUUklCVVRFID0gIndzZGxMb2NhdGlvbiI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJ0YXJnZXROYW1lc3BhY2UiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9OQU1FX0FUVFJJQlVURSA9ICJwb3J0TmFtZSI7CS8vJE5PTi1OTFMtMSQNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGM4ZjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV29ya3NwYWNlQ1VGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLXB1YmxpYyBjbGFzcyBXb3Jrc3BhY2VDVUZpbmRlciBpbXBsZW1lbnRzIElDb21waWxhdGlvblVuaXRGaW5kZXINCi17DQotCXByaXZhdGUgZmluYWwgSUphdmFNb2RlbCBqYXZhTW9kZWw7DQotCXByaXZhdGUgZmluYWwgSVByb2plY3RTZWxlY3RvcltdIHNlbGVjdG9yczsNCi0JDQotCXB1YmxpYyBXb3Jrc3BhY2VDVUZpbmRlcihJSmF2YU1vZGVsIGphdmFNb2RlbCwgSVByb2plY3RTZWxlY3RvcltdIHNlbGVjdG9ycykgew0KLQkJaWYgKGphdmFNb2RlbCA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXZhTW9kZWwiKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQl0aGlzLmphdmFNb2RlbCA9IGphdmFNb2RlbDsNCi0JCWlmIChzZWxlY3RvcnMgPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigic2VsZWN0b3IiKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQl0aGlzLnNlbGVjdG9ycyA9IHNlbGVjdG9yczsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgZmluZChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElDb21waWxhdGlvblVuaXRIYW5kbGVyIGN1SGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCWN1SGFuZGxlci5zdGFydGVkKCk7DQotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJbW9uaXRvci5iZWdpblRhc2soSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuSkFYV1NfRE9NX0xPQURJTkcsIGFzc3VtZVdvcmsoKSk7DQotCQl9CQkNCi0JCXRyeSB7DQotCQkJZm9yIChJSmF2YVByb2plY3QgcHJqIDogamF2YU1vZGVsLmdldEphdmFQcm9qZWN0cygpKQ0KLQkJCXsNCi0JCQkJaWYgKG1vbml0b3IhPW51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCXRocm93IG5ldyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbigiSkFYLVdTIERPTSBsb2FkaW5nIGNhbmNlbGVkIiwgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuV29ya3NwYWNlQ1VGaW5kZXJfTE9BRElOR19DQU5DRUxFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJaWYgKGFwcHJvdmUocHJqKSkNCi0JCQkJew0KLQkJCQkJY3VIYW5kbGVyLmhhbmRsZShwcmopOw0KLQkJCQkJcGFyc2VQcm9qZWN0KHByaiwgbW9uaXRvciwgY3VIYW5kbGVyKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQljdUhhbmRsZXIuZmluaXNoZWQoKTsNCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQltb25pdG9yLmRvbmUoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBpbnQgYXNzdW1lV29yaygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBDb3VudGluZ0NVSGFuZGxlciBjb3VudGluZ0hhbmRsZXIgPSBuZXcgQ291bnRpbmdDVUhhbmRsZXIoKTsNCi0JCWZvciAoSUphdmFQcm9qZWN0IHByaiA6IGphdmFNb2RlbC5nZXRKYXZhUHJvamVjdHMoKSkgewkJDQotCQkJaWYgKGFwcHJvdmUocHJqKSkgew0KLQkJCQlwYXJzZVByb2plY3QocHJqLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBjb3VudGluZ0hhbmRsZXIpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNvdW50aW5nSGFuZGxlci5jb3VudDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHBhcnNlUHJvamVjdChmaW5hbCBJSmF2YVByb2plY3QgcHJqLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElDb21waWxhdGlvblVuaXRIYW5kbGVyIGN1SGFuZGxlcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gDQotCXsNCi0JCWZvciAoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgOiBwcmouZ2V0UGFja2FnZUZyYWdtZW50cygpKSANCi0JCXsNCi0JCQlpZiAocGFja2FnZUZyYWdtZW50LmdldEtpbmQoKSAhPSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IGN1IDogcGFja2FnZUZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdHMoKSkgDQotCQkJew0KLQkJCQlpZiAobW9uaXRvciE9bnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJdGhyb3cgbmV3IFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKCJKQVgtV1MgRE9NIGxvYWRpbmcgY2FuY2VsZWQiLEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLldvcmtzcGFjZUNVRmluZGVyX0xPQURJTkdfQ0FOQ0VMRUQpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJDQotCQkJCWN1SGFuZGxlci5oYW5kbGUoY3UpOw0KLQkJCQkNCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopIHsNCi0JCWZvciAoSVByb2plY3RTZWxlY3RvciBzZWxlY3RvciA6IHNlbGVjdG9ycykgew0KLQkJCWlmIChzZWxlY3Rvci5hcHByb3ZlKHByaikpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVyIGNvdW50cyB0aGUgY29tcGlsYXRpb24gdW5pdHMgDQotCSAqICANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHJvdGVjdGVkIGNsYXNzIENvdW50aW5nQ1VIYW5kbGVyIGltcGxlbWVudHMgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIgDQotCXsNCi0JCXByaXZhdGUgaW50IGNvdW50Ow0KLQkJDQotCQlwdWJsaWMgdm9pZCBzdGFydGVkKCkgew0KLQkJCWNvdW50ID0gMDsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIHZvaWQgaGFuZGxlKElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCQljb3VudCsrOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHsgLyogbm8gcHJvY2Vzc2luZyBuZWVkZWQgKi8gfQ0KLQkJcHVibGljIHZvaWQgaGFuZGxlKElKYXZhUHJvamVjdCBqcHJqKSB7IC8qIG5vIHByb2Nlc3NpbmcgbmVlZGVkICovIH0NCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0Fubm90YXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0Fubm90YXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZWFmYWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uaW1wbC5Bbm5vdGF0aW9uQWRhcHRlcjsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IHRoYXQgYWRhcHRzIERPTSBvYmplY3RzIHRvIHtAbGluayBJQW5ub3RhdGlvbkFkYXB0ZXJ9IGludGVyZmFjZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEFubm90YXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbA0KLXsNCi0JLyoqDQotCSAqIFNpbmdsZXRvbiAtIHVzZSB0aGlzIHN0YXRpYyBpbnN0YW5jZSB0byBhZGFwdCBvYmplY3RzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFubm90YXRpb25BZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkoKTsNCi0JDQotCXByaXZhdGUgQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgew0KLQkJLy8gc2luZ2xldG9uDQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQotCQlyZXR1cm4gdHlwZSA9PSBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3M7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSANCi0Jew0KLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uQWRhcHRlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9JQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9JQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGY0Mjc1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vSUFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRoYXQgaG9sZHMgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBhbm5vdGF0aW9ucyBhcHBsaWVkIG9uIHRoZQ0KLSAqIGphdmEgYXJ0aWZhY3QvcyB3aGljaCBpcyByZXByZXNlbnQgYnkgdGhlIERPTSBvYmplY3QgYWRhcHRlZCB0byB0aGlzIGludGVyZmFjZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkFkYXB0ZXIgDQotew0KLQkvKioNCi0JICogUHJvdmlkZXMgdGhlIHtAbGluayBJQW5ub3RhdGlvbn0gZm9yIGFubm90YXRpb24gd2l0aCA8Y29kZT5hbm5GUU5hbWU8L2NvZGU+LiANCi0JICogQHBhcmFtIGFubkZRTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFubm90YXRpb24NCi0JICogQHJldHVybiBsb2NhdG9yIGluc3RhbmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBleGlzdGluZw0KLQkgKi8NCi0JcHVibGljIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oU3RyaW5nIGFubkZRTmFtZSk7DQotCQ0KLQkvKioNCi0JICogQWRkcyBhbm5vdGF0aW9uIHRvIHRoZSBsaXN0IG9mIHVzZWQgYW5ub3RhdGlvbnMuDQotCSAqIDxjb2RlPmFubm90YXRpb248L2NvZGU+IGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHRoZSBsb2NhdG9yIGZvciB0aGlzIGFubm90YXRpb24NCi0JICogaXMgcmVtb3ZlZC4NCi0JICogQHBhcmFtIGFubkZRTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFubm90YXRpb24NCi0JICogQHBhcmFtIGFubm90YXRpb24gdGggYW5ub3RhdGlvbiBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihTdHJpbmcgYW5uRlFOYW1lLCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9pbXBsL0Fubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkNmZiYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJTG9jYXRvckFkYXB0ZXJ9Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElBbm5vdGF0aW9uQWRhcHRlcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50Pj4gYW5ub3RhdGlvbkxvY2F0b3JzOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvbkFkYXB0ZXIoKSB7DQotCQlhbm5vdGF0aW9uTG9jYXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+PigpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbihmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbkZRTmFtZSkgDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKGFubm90YXRpb25GUU5hbWUsICJhbm5vdGF0aW9uRlFOYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIGFubm90YXRpb25Mb2NhdG9ycy5nZXQoYW5ub3RhdGlvbkZRTmFtZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihmaW5hbCBTdHJpbmcgYW5uRlFOYW1lLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oYW5uRlFOYW1lLCAiYW5uRlFOYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQkJYW5ub3RhdGlvbkxvY2F0b3JzLnB1dChhbm5GUU5hbWUsIGFubm90YXRpb24pOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQotCQlyZXR1cm4gSUFubm90YXRpb25BZGFwdGVyLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2I3NGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBnaXZlcyBkZWZhdWx0IHZhbHVlcyBmb3Ige0BsaW5rIElXZWJNZXRob2R9IG9iamVjdHMNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlEZWZhdWx0cw0KLXsNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyA9PSB0eXBlOw0KLQl9DQotCQ0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKWdldFRhcmdldCgpOyANCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKQ0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19OQU1FOg0KLQkJCXJldHVybiBnZXRNZXRob2ROYW1lKHdlYk1ldGhvZCk7DQotCQl9CQ0KLQkJDQotCQlyZXR1cm4gd2ViTWV0aG9kLmVHZXQoZmVhdHVyZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kTmFtZShmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkNCi0Jew0KLQkJaW50IHBvcyA9IHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpLmluZGV4T2YoJygnKTsNCi0JCWlmIChwb3MgPiAtMSkgew0KLQkJCXJldHVybiB3ZWJNZXRob2QuZ2V0SW1wbGVtZW50YXRpb24oKS5zdWJzdHJpbmcoMCwgcG9zKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2JiOWUxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1BhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvcjsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBmb3Ige0BsaW5rIElXZWJQYXJhbX0gYXJlIGVkaXRhYmxlDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSVByb3BlcnR5RGVmYXVsdHMNCi17DQotCXByaXZhdGUgZmluYWwgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYyA9IG5ldyBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvcigpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyA9PSB0eXBlOw0KLQl9DQotCQ0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpDQotCXsNCi0JCWFzc2VydCBnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElXZWJQYXJhbTsNCi0JCQ0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gKElXZWJQYXJhbSlnZXRUYXJnZXQoKTsNCi0JCQ0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpIA0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX05BTUU6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJQYXJhbSk7CQkJDQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fUEFSVF9OQU1FOg0KLQkJCXJldHVybiBkZWZDYWxjKCkuY2FsY1dlYlBhcmFtRGVmYXVsdE5hbWUod2ViUGFyYW0pOwkJCQ0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMoKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpLCB3ZWJQYXJhbSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSOg0KLQkJCXJldHVybiBkZWZDYWxjKCkuZ2V0RGVmYXVsdFBhcmFtSW5IZWRhZXIoKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5EOg0KLQkJCXJldHVybiBkZWZDYWxjKCkuZ2V0RGVmYXVsdFBhcmFtS2luZCgpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd2ViUGFyYW0uZUdldChmZWF0dXJlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIGRlZkNhbGMoKSB7DQotCQlyZXR1cm4gZGVmQ2FsYzsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzgyYmU1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21BZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGZhY3RvcnkgZm9yIGFkYXB0ZXJzIGltcGxlbWVudGluZyB7QGxpbmsgSVByb3BlcnR5U3RhdGV9IGludGVyZmFjZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeSBleHRlbmRzIERvbUFkYXB0ZXJGYWN0b3J5DQotew0KLQkvKioNCi0JICogU2luZ2xldG9uIGluc3RhbmNlIGZvciB0aGlzIGFkYXB0ZXIgZmFjdG9yeSANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IG9iamVjdDsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgV3NQcm9wZXJ0eURlZmF1bHRzQWRhcHRlcigpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFNlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyKCk7DQotCX0JDQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IE1ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCl7DQotCQlyZXR1cm4gbmV3IFBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOWNjYTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRoYXQgcHJvdmlkZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIHtAbGluayBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBwcm9wZXJ0aWVzIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eURlZmF1bHRzIA0KLXsNCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSANCi0Jew0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlnZXRUYXJnZXQoKTsNCi0JCQ0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FOg0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeUZRTmFtZShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQl9CQkJDQotCQkNCi0JCXJldHVybiBzZWkuZUdldChmZWF0dXJlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyA9PSB0eXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvV3NQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA3YWM5NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLQ0KLXB1YmxpYyBjbGFzcyBXc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlEZWZhdWx0cyANCi17DQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gKElXZWJTZXJ2aWNlKWdldFRhcmdldCgpOw0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkNCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX05BTUU6IA0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmdldERlZmF1bHRTZXJ2aWNlTmFtZSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRToNCi0JCQlyZXR1cm4gSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydE5hbWUod3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5RlFOYW1lKHdzLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd3MuZUdldChmZWF0dXJlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyA9PSB0eXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDE2ODE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5QYXJhbVZhbHVlQ29tcGFyYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEJhc2UgY2xhc3MgZm9yIERPTSBhZGFwdGVycyB0aGF0IGxpc3RlbiB0byBjaGFuZ2VzIGluIERPTSBvYmplY3RzIGFuZCBhcHBsaWVzIGl0DQotICogdG8gdGhlIHVuZGVybHlpbmcgamF2YSBjbGFzcy4gRXh0ZW5kZXJzIHNob3VsZCBpbXBsZW1lbnQgPGNvZGU+Z2V0QW5ub3RhdGlvbigpPC9jb2RlPg0KLSAqIG1ldGhvZCB0byBwcm92aWRlIHRoZSB7QGxpbmsgSUFubm90YXRpb259IGluc3RhbmNlIHRvIGJlIHNhdmVkIHRvIGphdmEgY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJQW5ub3RhdGlvblNlcmlhbGl6ZXINCi17DQotCXByaXZhdGUgZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZTsNCi0JcHJpdmF0ZSBmaW5hbCBEb21VdGlsIHV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQlwcml2YXRlIGZpbmFsIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIGRlZkNhbGMgPSBuZXcgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IoKTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnJlc291cmNlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIEFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIoZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShyZXNvdXJjZSwgInJlc291cmNlIik7Ly8kTk9OLU5MUy0xJA0KLQkJDQotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpDQotCXsNCi0JCWlmICghcmVzb3VyY2UuaXNTYXZlRW5hYmxlZCgpIHx8IG1zZy5pc1RvdWNoKCkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgIT0gTm90aWZpY2F0aW9uLlNFVCAmJiBtc2cuZ2V0RXZlbnRUeXBlKCkgIT0gTm90aWZpY2F0aW9uLlVOU0VUKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlpZiAoY2hlY2tWYWx1ZShtc2cpKSB7DQotCQkJc2F2ZShtc2cpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogRGVmYXVsdCB2YWx1ZSBjaGVjayAtIHdvcmtzIG9ubHkgZm9yIFN0cmluZyB2YWx1ZXMsIHRyaW1zIHRoZQ0KLQkgKiBuZXcgdmFsdWUgY2hlY2tzIGZvciA8Y29kZT5udWxsPC9jb2RlPiBhbmQgaWYgaXQgaXMgbm90IG51bGwgcHV0cyB0aGUNCi0JICogdmFsdWUgdG8gdGhlIG9iamVjdCBhbmQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+DQotCSAqIEBwYXJhbSBtc2cNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbiBjYXNlIHRoZSB2YWx1ZSBpcyB2YWxpZA0KLQkgKi8NCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKQ0KLQl7DQotCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KWdldFRhcmdldCgpOw0KLQkJZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gZ2V0TmV3U3RyaW5nVmFsdWUobXNnKTsNCi0JCWlmIChuZXdWYWx1ZT09bnVsbCkgewkJCQ0KLQkJCXJldHVybiByZXZlcnRWYWx1ZShvYmosIG1zZyk7DQotCQl9DQotCQkNCi0JCS8vIHRoaXMgY2FsbCBpcyBuZWVkZWQgY2F1c2UgbmV3VmFsdWUgbWlnaHQgYmUgdHJpbW1lZA0KLQkJcHV0VmFsdWUob2JqLCAoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCksIG5ld1ZhbHVlKTsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzYXZlKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpDQotCXsNCi0JCWJvb2xlYW4gcHJvY2Vzc2VkID0gZmFsc2U7DQotCQl0cnkgew0KLQkJCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7DQotCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCWlmIChhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKT09MCAmJiAhaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSkgew0KLQkJCQlnZXRBbm5vdGF0aW9uV3JpdGVyKCkucmVtb3ZlKGFubm90YXRpb24pOw0KLQkJCX0gZWxzZSB7DQotCQkJCWdldEFubm90YXRpb25Xcml0ZXIoKS51cGRhdGUoYW5ub3RhdGlvbik7DQotCQkJfQ0KLQkJCXByb2Nlc3NlZCA9IHRydWU7DQotCQl9IA0KLQkJY2F0Y2ggKEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24gZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQkJZmluYWxseSB7DQotCQkJaWYoIXByb2Nlc3NlZCkgew0KLQkJCQlyZXZlcnRWYWx1ZSgoRU9iamVjdClnZXRUYXJnZXQoKSwgbXNnKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBhYnN0cmFjdCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQ0KLQl7DQotCSAgICByZXR1cm4gSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzPT10eXBlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSgpCXsNCi0JCXJldHVybiByZXNvdXJjZTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIERvbVV0aWwgdXRpbCgpIHsNCi0JCXJldHVybiB1dGlsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYygpCXsNCi0JCXJldHVybiBkZWZDYWxjOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbldyaXRlciBnZXRBbm5vdGF0aW9uV3JpdGVyKCkNCi0Jew0KLQkJcmV0dXJuIEFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSVBhcmFtVmFsdWVQYWlyIGNyZWF0ZVBhcmFtVmFsdWUoU3RyaW5nIHBhcmFtLCBTdHJpbmcgdmFsdWUpDQotCXsNCi0JCWZpbmFsIElWYWx1ZSBpVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSh2YWx1ZSk7DQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShwYXJhbSwgaVZhbHVlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElQYXJhbVZhbHVlUGFpciBjcmVhdGVQYXJhbVZhbHVlKFN0cmluZyBwYXJhbSwgYm9vbGVhbiB2YWx1ZSkNCi0Jew0KLQkJZmluYWwgSVZhbHVlIGlWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZSh2YWx1ZSk7DQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShwYXJhbSwgaVZhbHVlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlKGZpbmFsIEVPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgdHlwZUZRTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlFT2JqZWN0IHdlYlByb2plY3QgPSBvYmplY3QuZUNvbnRhaW5lcigpOw0KLQkJd2hpbGUoISh3ZWJQcm9qZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSAmJiB3ZWJQcm9qZWN0IT1udWxsKSB7DQotCQkJd2ViUHJvamVjdCA9IHdlYlByb2plY3QuZUNvbnRhaW5lcigpOw0KLQkJfQ0KLQkJDQotCQlpZiAod2ViUHJvamVjdD09bnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gKChJV2ViU2VydmljZVByb2plY3Qpd2ViUHJvamVjdCkuZ2V0TmFtZSgpOw0KLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gcmVzb3VyY2UuamF2YU1vZGVsKCkuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwkJDQotCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUodHlwZUZRTmFtZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZWFkcyB0aGUgbmV3IHN0cmluZyB2YWx1ZSBmcm9tIDxjb2RlPm1zZzwvY29kZT4uIA0KLQkgKiBAcGFyYW0gbXNnDQotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZhbHVlIGlzIGVtcHR5IHN0cmluZyBvciA8Y29kZT5udWxsPC9jb2RlPiwgb3RoZXJ3aXNlIHRoZSB0cmltbWVkIHN0cmluZyB2YWx1ZS4NCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3U3RyaW5nVmFsdWUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgDQotCXsNCi0JCWZpbmFsIFN0cmluZyBuZXdWYWx1ZSA9IChtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKSA9PSBudWxsKSA/IG51bGwgOiBtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKS50cmltKCk7DQotCQlpZiAobmV3VmFsdWUgIT0gbnVsbCAmJiBuZXdWYWx1ZS5sZW5ndGgoKSA+IDApIHsNCi0JCQlyZXR1cm4gbmV3VmFsdWU7DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV2ZXJ0cyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGNoYW5nZWQgZmVhdHVyZSB0byB0aGUgb2xkIHZhbHVlIGFuZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPg0KLQkgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmUgcmV2ZXJ0ZWQNCi0JICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIGFsd2F5cyByZXR1cm5zIGZhbHNlDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXZlcnRWYWx1ZShmaW5hbCBFT2JqZWN0IG9iaiwgZmluYWwgTm90aWZpY2F0aW9uIG1zZykNCi0Jew0KLQkJcHV0VmFsdWUob2JqLCAoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCksIG1zZy5nZXRPbGRWYWx1ZSgpKTsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFB1dHMgdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiB0byB0aGUgY2hhbmdlZCBmZWF0dXJlLg0KLQkgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmUgdXBkYXRlZA0KLQkgKiBAcGFyYW0gbXNnIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZSB0byBiZSBwdXQNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHB1dFZhbHVlKGZpbmFsIEVPYmplY3Qgb2JqLCBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlKQ0KLQl7DQotCQl0cnkgew0KLQkJCW9iai5lU2V0RGVsaXZlcihmYWxzZSk7DQotCQkJb2JqLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlvYmouZVNldERlbGl2ZXIodHJ1ZSk7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBUcmVlU2V0PElQYXJhbVZhbHVlUGFpcj4gY3JlYXRlUGFyYW1WYWx1ZVNvcnRlZFRyZWVTZXQoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFRyZWVTZXQ8SVBhcmFtVmFsdWVQYWlyPihuZXcgUGFyYW1WYWx1ZUNvbXBhcmF0b3IoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9NZXRob2RTZXJpYWxpemVyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4NzVmN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotLyoqDQotICogQWRhcHRlciBmb3Ige0BsaW5rIElXZWJNZXRob2R9IHNlcmlhbGl6YXRpb24uIExpc3RlbnMgZm9yIHByb3BlcnR5IGNoYW5nZSBub3RpZmljYXRpb25zIGFuZCANCi0gKiBzZXJpYWxpemVzIHRoZSBuZXcgb2JqZWN0IGNvbnRlbnQgdG8gdGhlIHVuZGVybHlpbmcgamF2YSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgRE9NIHJlc291cmNlIA0KLQkgKi8NCi0JcHVibGljIE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UpIHsNCi0JCXN1cGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblJlcXVpcmVkKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsJCQ0KLQkJYXNzZXJ0IGdldFRhcmdldCgpIGluc3RhbmNlb2YgSVdlYk1ldGhvZDsNCi0NCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2QpZ2V0VGFyZ2V0KCk7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYk1ldGhvZC5lQ29udGFpbmVyKCk7DQotCQlpZiAoc2VpID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCWZpbmFsIElUeXBlIHNlaVR5cGUgPSBmaW5kVHlwZShzZWksIHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gdXRpbCgpLmZpbmRNZXRob2Qoc2VpVHlwZSwgd2ViTWV0aG9kKTsJCQ0KLQkJaWYgKG1ldGhvZD09bnVsbCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIklNZXRob2QgZm9yIERPTSBtZXRob2Qgd2FzIG5vdCBmb3VuZCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT04sIG1ldGhvZCwgZGVmaW5lUGFyYW1WYWx1ZXMod2ViTWV0aG9kLCBtZXRob2QpKTsJDQotCX0NCi0JDQotCXByaXZhdGUgU2V0PElQYXJhbVZhbHVlUGFpcj4gZGVmaW5lUGFyYW1WYWx1ZXMoZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElNZXRob2QgbWV0aG9kKQ0KLQl7DQotCQlmaW5hbCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMgPSBjcmVhdGVQYXJhbVZhbHVlU29ydGVkVHJlZVNldCgpOw0KLQkJaWYgKHdlYk1ldGhvZC5nZXROYW1lKCkhPW51bGwgJiYgIXdlYk1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKSkgew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURSwgd2ViTWV0aG9kLmdldE5hbWUoKSkpOw0KLQkJfQ0KLQkJDQotCQlpZiAod2ViTWV0aG9kLmlzRXhjbHVkZWQoKSkgew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9FWENMVURFRF9BVFRSSUJVVEUsIHRydWUpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrVmFsdWUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykNCi0Jew0KLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCk7DQotCQlpZiAoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSE9RG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUUpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAoIXN1cGVyLmNoZWNrVmFsdWUobXNnKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1BhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU3YjFhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLkhFQURFUl9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuUEFSVF9OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLklBbm5vdGF0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuSmVlNURvbVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgc2VyaWFsaXplcyB7QGxpbmsgSVdlYlBhcmFtfSBvYmplY3RzIHRvIFdlYlBhcmFtIGFubm90YXRpb24gaW4gdW5kZXJseWluZyBqYXZhDQotICogY2xhc3MuIENoZWNrcyB0aGUgYXR0cmlidXRlIHZhbHVlcyBhbmQgb21pdHMgdGhlIGRlZmF1bHRzLg0KLSAqICANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKZWU1RG9tVXRpbHMgamVlNVV0aWxzID0gSmVlNURvbVV0aWxzLmdldEluc3RhbmNlKCk7DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIHJlc291cmNlDQotCSAqLw0KLQlwdWJsaWMgUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJc3VwZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSANCi0Jew0KLQkJaWYgKCFyZXNvdXJjZSgpLmlzU2F2ZUVuYWJsZWQoKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCk7DQotCQlpZiAoZmVhdHVyZS5nZXRGZWF0dXJlSUQoKT09RG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUUpIA0KLQkJew0KLQkJCXRyeSB7DQotCQkJCWNoYW5nZVBhcnROYW1lKG1zZyk7DQotCQkJfSANCi0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsNCi0JCQkJKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCX0NCi0JCX0JDQotCQkNCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZVBhcnROYW1lKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gKElXZWJQYXJhbSlnZXRUYXJnZXQoKTsNCi0JCWlmIChqZWU1VXRpbHMuaXNQYXJ0TmFtZVVzZWQod2ViUGFyYW0pKSANCi0JCXsNCi0JCQlmaW5hbCBJQW5ub3RhdGlvbkFkYXB0ZXIgYW5uQWRhcHRlciA9IChJQW5ub3RhdGlvbkFkYXB0ZXIgKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3ZWJQYXJhbSwgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm4gPSBhbm5BZGFwdGVyLmdldEFubm90YXRpb24oV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTik7DQotCQkJaWYgKGFubiE9bnVsbCAmJiBhbm4uZ2V0UHJvcGVydHlWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5QQVJUX05BTUVfQVRUUklCVVRFKSE9bnVsbCkgew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAoY2hlY2tWYWx1ZShtc2cpKSB7DQotCQkJcHV0VmFsdWUod2ViUGFyYW0sIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FLCBtc2cuZ2V0TmV3VmFsdWUoKSk7DQotCQl9DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gKElXZWJQYXJhbSlnZXRUYXJnZXQoKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJaWYgKHdlYk1ldGhvZD09bnVsbCB8fCB3ZWJNZXRob2QuZUNvbnRhaW5lcigpPT1udWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCWZpbmFsIElUeXBlIHNlaVR5cGUgPSBmaW5kVHlwZSh3ZWJNZXRob2QsICgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl3ZWJNZXRob2QuZUNvbnRhaW5lcigpKS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gdXRpbCgpLmZpbmRNZXRob2Qoc2VpVHlwZSwgd2ViTWV0aG9kKTsNCi0JCQ0KLQkJcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oV1BfQU5OT1RBVElPTiwgDQotCQkJCW1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpLA0KLQkJCQlkZWZpbmVQYXJhbVZhbHVlcyh3ZWJQYXJhbSwgd2ViTWV0aG9kKSk7CQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgU2V0PElQYXJhbVZhbHVlUGFpcj4gZGVmaW5lUGFyYW1WYWx1ZXMoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtLCBmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkNCi0Jew0KLQkJZmluYWwgU2V0PElQYXJhbVZhbHVlUGFpcj4gdmFsdWVQYWlycyA9IGNyZWF0ZVBhcmFtVmFsdWVTb3J0ZWRUcmVlU2V0KCk7DQotCQkNCi0JCWlmICh3ZWJQYXJhbS5nZXRLaW5kKCkhPVdlYlBhcmFtS2luZC5JTikgew0KLQkJCXZhbHVlUGFpcnMuYWRkKGNyZWF0ZU1vZGVWYWx1ZVBhaXIod2ViUGFyYW0pKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKHdlYlBhcmFtLmlzSGVhZGVyKCkpIHsNCi0JCQl2YWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKEhFQURFUl9BVFRSSUJVVEUsIHRydWUpKTsNCi0JCX0NCi0NCi0JCWZpbmFsIFN0cmluZyBkZWZOYW1lID0gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYlBhcmFtKTsNCi0JCWlmIChqZWU1VXRpbHMuaXNOYW1lUmVxdWlyZWQod2ViUGFyYW0pIHx8IA0KLQkJCSghd2ViUGFyYW0uZ2V0TmFtZSgpLmVxdWFscyhkZWZOYW1lKSAmJiBqZWU1VXRpbHMuaXNOYW1lVXNlZCh3ZWJQYXJhbSkpKSANCi0JCXsNCi0JCQl2YWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKE5BTUVfQVRUUklCVVRFLCB3ZWJQYXJhbS5nZXROYW1lKCkpKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGplZTVVdGlscy5pc1BhcnROYW1lVXNlZCh3ZWJQYXJhbSkgJiYgIXdlYlBhcmFtLmdldFBhcnROYW1lKCkuZXF1YWxzKGRlZk5hbWUpKSB7DQotCQkJdmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShQQVJUX05BTUVfQVRUUklCVVRFLCB3ZWJQYXJhbS5nZXRQYXJ0TmFtZSgpKSk7DQotCQl9DQotDQotCQlpZiAod2ViUGFyYW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkhPW51bGwpIA0KLQkJew0KLQkJCWZpbmFsIFN0cmluZyBkZWZOcyA9IGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMod2ViTWV0aG9kLCB3ZWJQYXJhbSk7DQotCQkJaWYgKHdlYlBhcmFtLmdldFRhcmdldE5hbWVzcGFjZSgpLnRyaW0oKS5sZW5ndGgoKSAhPSAwICYmICF3ZWJQYXJhbS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoZGVmTnMpKSB7DQotCQkJCXZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUsIHdlYlBhcmFtLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gdmFsdWVQYWlyczsNCi0JfQkNCi0JDQotCXByb3RlY3RlZCBJUGFyYW1WYWx1ZVBhaXIgY3JlYXRlTW9kZVZhbHVlUGFpcihmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pIA0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBudWxsOw0KLQkJc3dpdGNoICh3ZWJQYXJhbS5nZXRLaW5kKCkpIA0KLQkJew0KLQkJY2FzZSBPVVQ6DQotCQkJdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV0VCX1BBUkFNX01PREVfT1VUKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgSU5PVVQ6DQotCQkJdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV0VCX1BBUkFNX01PREVfSU5PVVQpOw0KLQkJCWJyZWFrOw0KLQkJZGVmYXVsdDoNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuTU9ERV9BVFRSSUJVVEUsIHZhbHVlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUGFyYW1XaXRoU2FtZU5hbWUoZmluYWwgSVdlYlBhcmFtIHBhcmFtLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClwYXJhbS5lQ29udGFpbmVyKCk7DQotCQlmb3IgKElXZWJQYXJhbSB3ZWJQYXJhbSA6IHdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkpIA0KLQkJew0KLQkJCWlmKHdlYlBhcmFtPT1wYXJhbSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJaWYod2ViUGFyYW0uZ2V0TmFtZSgpLmVxdWFscyhuZXdOYW1lKSkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrVmFsdWUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgDQotCXsNCi0JCWlmKCgoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkpLmdldEZlYXR1cmVJRCgpPT1Eb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmNoZWNrVmFsdWUobXNnKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VpU2VyaWFsaXplckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZWlTZXJpYWxpemVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhM2JiYTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZWlTZXJpYWxpemVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotLyoqDQotICogQWRhcHRlciB0aGF0IG9uIHtAbGluayBJV2ViU2VydmljZX0gb2JqZWN0IGNoYW5nZSBzYXZlcyB0aGUgYW5ub3RhdGlvbiB0byANCi0gKiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0LiBVc2VzIHtAbGluayBKYXhXc1dvcmtzcGFjZVJlc291cmNlfSB0byBkZWZpbmUgDQotICogaWYgc2F2ZSBvcGVyYXRpb24gaXMgZW5hYmxlZC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaVNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSByZXNvdXJjZQ0KLQkgKi8NCi0JcHVibGljIFNlaVNlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UpIHsNCi0JCXN1cGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblJlcXVpcmVkKCkgew0KLQkJcmV0dXJuIHRydWU7DQotCX0JDQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gCQ0KLQl7DQotCQlhc3NlcnQgZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLQ0KLQkJcmV0dXJuIGNyZWF0ZUlBbm5vdGF0aW9uKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWdldFRhcmdldCgpLCByZXNvdXJjZSgpLmphdmFNb2RlbCgpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gY3JlYXRlSUFubm90YXRpb24oZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShzZWksICJzZWkiKTsvLyROT04tTkxTLTEkDQotCQludWxsQ2hlY2tQYXJhbShqYXZhTW9kZWwsICJqYXZhTW9kZWwiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCWlmIChzZWkuaXNJbXBsaWNpdCgpKSANCi0JCXsNCi0JCQlpZiAoc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuc2l6ZSgpID09IDApIHsNCi0JCQkJLy8gdGhlIGltcGxpY2l0IFNFSSBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdA0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotCQkJDQotCQkJcmV0dXJuIG5ldyBXc1NlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKCkpLmNyZWF0ZUlBbm5vdGF0aW9uKHNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmdldCgwKSwgamF2YU1vZGVsKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgdHlwZSA9IGZpbmRUeXBlKHNlaSwgc2VpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJaWYgKHR5cGUgPT0gbnVsbCkgew0KLQkJCS8vIHRoZSBleHBsaWNpdCBTRUkgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIHByb2plY3QNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCWZpbmFsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycyA9IGNyZWF0ZVBhcmFtVmFsdWVTb3J0ZWRUcmVlU2V0KCk7DQotDQotCQlpZiAoc2VpLmdldE5hbWUoKSE9bnVsbCAmJiAhc2VpLmdldE5hbWUoKS5lcXVhbHMoSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydHR5cGVOYW1lKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKSkpIHsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEUsIHNlaS5nZXROYW1lKCkpKTsNCi0JCX0NCi0JCWlmIChzZWkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkhPW51bGwgJiYgIXNlaS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UodHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKSkpIHsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUsIHNlaS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihXU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OLCB0eXBlLCBwYXJhbVZhbHVlUGFpcnMpOwkNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0ZmJiM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21BZGFwdGVyRmFjdG9yeTsNCi0vKioNCi0gKiBGYWN0b3J5IGZvciBzZXJpYWxpemF0aW9uIGFkYXB0ZXJzLiBUaGlzIGZhY3RvcnkgaXMgaW5zdGFudGlhdGVkIG9uIGNvbnN0cnVjdGlvbiBieSANCi0gKiB7QGxpbmsgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZX0gYW5kIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSB0aGUgc2FtZSBpbnN0YW5jZQ0KLSAqIGluIGNhc2UgeW91IG5lZWQgdGhpcyBmYWN0b3J5Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRG9tQWRhcHRlckZhY3RvcnkNCi17DQotCXByaXZhdGUgZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciANCi0JICogQHBhcmFtIHJlc291cmNlDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5yZXNvdXJjZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkoZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHJlc291cmNlLCAicmVzb3VyY2UiKTsvLyROT04tTkxTLTEkDQotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFNlaVNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJNZXRob2RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBNZXRob2RTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKQ0KLQl7DQotCQlyZXR1cm4gSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1dzU2VyaWFsaXplckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9Xc1NlcmlhbGl6ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlMWQ1YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1dzU2VyaWFsaXplckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRoYXQgb24ge0BsaW5rIElXZWJTZXJ2aWNlfSBvYmplY3QgY2hhbmdlIHNhdmVzIHRoZSBhbm5vdGF0aW9uIHRvIA0KLSAqIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQuIFVzZXMge0BsaW5rIEpheFdzV29ya3NwYWNlUmVzb3VyY2V9IHRvIGRlZmluZSANCi0gKiBpZiBzYXZlIG9wZXJhdGlvbiBpcyBlbmFibGVkLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV3NTZXJpYWxpemVyQWRhcHRlciBleHRlbmRzIEFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXINCi17DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciANCi0JICogQHBhcmFtIHJlc291cmNlDQotCSAqLw0KLQlwdWJsaWMgV3NTZXJpYWxpemVyQWRhcHRlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSANCi0Jew0KLQkJc3VwZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQkJDQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWFzc2VydCBnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlOw0KLQkJDQotCQlyZXR1cm4gY3JlYXRlSUFubm90YXRpb24oKElXZWJTZXJ2aWNlKWdldFRhcmdldCgpLCByZXNvdXJjZSgpLmphdmFNb2RlbCgpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGNyZWF0ZUlBbm5vdGF0aW9uKGZpbmFsIElXZWJTZXJ2aWNlIHdzLCBmaW5hbCBJSmF2YU1vZGVsIGphdmFNb2RlbCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQludWxsQ2hlY2tQYXJhbSh3cywgIndzIik7Ly8kTk9OLU5MUy0xJA0KLQkJbnVsbENoZWNrUGFyYW0oamF2YU1vZGVsLCAiamF2YU1vZGVsIik7Ly8kTk9OLU5MUy0xJA0KLQkJDQotCQlmaW5hbCBJVHlwZSB0eXBlID0gZmluZFR5cGUod3MsIHdzLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJaWYgKHR5cGU9PW51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzID0gY3JlYXRlUGFyYW1WYWx1ZVNvcnRlZFRyZWVTZXQoKTsNCi0JCQ0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCWlmIChzZWkhPW51bGwpIA0KLQkJewkJCQ0KLQkJCWlmIChzZWkuaXNJbXBsaWNpdCgpKSANCi0JCQl7DQotCQkJCVN0cmluZyBzZWlOYW1lID0gc2VpLmdldE5hbWUoKTsNCi0JCQkJaWYgKCFKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpLmVxdWFscyhzZWlOYW1lKSkgew0KLQkJCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFLCB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXROYW1lKCkpKTsNCi0JCQkJfQ0KLQkJCX0gZWxzZSB7DQotCQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5FTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFLCB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXRJbXBsZW1lbnRhdGlvbigpKSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAod3MuZ2V0TmFtZSgpIT1udWxsICYmIA0KLQkJCSF3cy5nZXROYW1lKCkuZXF1YWxzKEpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKHdzLmdldEltcGxlbWVudGF0aW9uKCkpKSkgDQotCQl7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUsIHdzLmdldE5hbWUoKSkpOw0KLQkJfQkJCQkNCi0JCWlmICh3cy5nZXRQb3J0TmFtZSgpIT1udWxsICYmIA0KLQkJCSF3cy5nZXRQb3J0TmFtZSgpLmVxdWFscyhKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKSkpIA0KLQkJew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5QT1JUX05BTUVfQVRUUklCVVRFLCB3cy5nZXRQb3J0TmFtZSgpKSk7DQotCQl9DQotCQlpZiAod3MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkhPW51bGwgJiYgDQotCQkJIXdzLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSh0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkpKSkgDQotCQl7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFLCB3cy5nZXRUYXJnZXROYW1lc3BhY2UoKSkpOw0KLQkJfQ0KLQkJaWYgKHdzLmdldFdzZGxMb2NhdGlvbigpIT1udWxsKSB7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTRExfTE9DQVRJT05fQVRUUklCVVRFLCB3cy5nZXRXc2RsTG9jYXRpb24oKSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihXU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OLCB0eXBlLCBwYXJhbVZhbHVlUGFpcnMpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvTWV0aG9kUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvTWV0aG9kUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWZhODU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL01ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIERlZmluZXMgdGhlIHN0YXRlIG9mIHdlYiBtZXRob2QgcHJvcGVydGllcy4gSW4gY2FzZSB0aGUgbWV0aG9kIGlzIHBhcnQgb2YNCi0gKiBvdXRzaWRlLWluIHdlYiBzZXJ2aWNlIGFsbCBwcm9wZXJ0aWVzIGFyZSBpbW11dGFibGUuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSVByb3BlcnR5U3RhdGUgDQotew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWFibGUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIG1ldGhvZCA9IChJV2ViTWV0aG9kKWdldFRhcmdldCgpOyANCi0JCWlmIChpc091dGlkZUluV3MobWV0aG9kKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX05BTUU6DQotCQkJcmV0dXJuIHRydWU7DQotCQl9CQkNCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNPdXRpZGVJbldzKGZpbmFsIElXZWJNZXRob2QgbWV0aG9kKQ0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKW1ldGhvZC5lQ29udGFpbmVyKCk7DQotCQlpZiAoc2VpPT1udWxsKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlmb3IgKElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgOiBzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSkgew0KLQkJCWlmICh3ZWJTZXJ2aWNlLmdldFdzZGxMb2NhdGlvbigpIT1udWxsKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMDJlYTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5KZWU1RG9tVXRpbHM7DQotDQotLyoqDQotICogQ2xhc3MgdGhhdCBkZWZpbmVzIHdoaWNoIHByb3BlcnRpZXMgZm9yIHtAbGluayBJV2ViUGFyYW19IGFyZSBlZGl0YWJsZQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eVN0YXRlDQotew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWFibGUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIAkNCi0Jew0KLQkJYXNzZXJ0IGdldFRhcmdldCgpIGluc3RhbmNlb2YgSVdlYlBhcmFtOw0KLQkJDQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJaWYgKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKCJyZXR1cm4iKSkgey8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWlmIChpc091dHNpZGVJbldlYlNlcnZpY2Uod2ViUGFyYW0pKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkgDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fTkFNRToNCi0JCQlyZXR1cm4gaXNOYW1lQ2hhbmdlYWJsZSh3ZWJQYXJhbSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fUEFSVF9OQU1FOg0KLQkJCXJldHVybiBpc1BhcnROYW1lQ2hhbmdlYWJsZSh3ZWJQYXJhbSk7CQkJDQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gaXNUYXJnZXROU0NoYW5nZWFibGUod2ViUGFyYW0pOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFydE5hbWVDaGFuZ2VhYmxlKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7CQkNCi0JCQ0KLQkJcmV0dXJuICh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLlJQQyAmJg0KLQkJCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKT09U09BUEJpbmRpbmdVc2UuTElURVJBTCAmJg0KLQkJCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05hbWVDaGFuZ2VhYmxlKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7CQkNCi0JCWlmIChpc0RvY3VtZW50TGl0ZXJhbFdyYXBwZWQod2ViTWV0aG9kKSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlpZiAoSmVlNURvbVV0aWxzLmdldEluc3RhbmNlKCkuaXNOYW1lUmVxdWlyZWQod2ViUGFyYW0pKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCXJldHVybiB3ZWJQYXJhbS5pc0hlYWRlcigpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhcmdldE5TQ2hhbmdlYWJsZShmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOwkJDQotCQlpZiAoaXNEb2N1bWVudExpdGVyYWxXcmFwcGVkKHdlYk1ldGhvZCkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYlBhcmFtLmlzSGVhZGVyKCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzRG9jdW1lbnRMaXRlcmFsV3JhcHBlZChmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkNCi0Jew0KLQkJcmV0dXJuICEod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5SUEMgfHwNCi0JCQkJd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nVXNlKCk9PVNPQVBCaW5kaW5nVXNlLkVOQ09ERUQgfHwNCi0JCQkJd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKT09U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPdXRzaWRlSW5XZWJTZXJ2aWNlKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl3ZWJQYXJhbS5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpOwkJDQotCQlyZXR1cm4gRG9tVXRpbC5JTlNUQU5DRS5pc091dHNpZGVJbldlYlNlcnZpY2Uoc2VpKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlTdGF0ZS5jbGFzcyA9PSB0eXBlOw0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzU3ODVmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tQWRhcHRlckZhY3Rvcnk7DQotDQotLyoqDQotICogQWRhcHRlciBmYWN0b3J5IGZvciBhZGFwdGVycyBpbXBsZW1lbnRpbmcge0BsaW5rIElQcm9wZXJ0eVN0YXRlfSBpbnRlcmZhY2UuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBEb21BZGFwdGVyRmFjdG9yeQ0KLXsNCi0JLyoqDQotCSAqIFNpbmdsZXRvbiBpbnN0YW5jZSBmb3IgdGhpcyBhZGFwdGVyIGZhY3RvcnkgDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBJUHJvcGVydHlTdGF0ZS5jbGFzcyA9PSBvYmplY3Q7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFdzUHJvcGVydHlTdGF0ZUFkYXB0ZXIoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBTZWlQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQl9CQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJNZXRob2RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBNZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpew0KLQkJcmV0dXJuIG5ldyBQYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmJjYzZjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1NlaVByb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi0NCi0vKioNCi0gKiB7QGxpbmsgSVByb3BlcnR5U3RhdGV9IGFkYXB0ZXIgZm9yIHtAbGluayBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBvYmplY3RzLg0KLSAqICANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaVByb3BlcnR5U3RhdGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlTdGF0ZQ0KLXsNCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VhYmxlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSANCi0Jew0KLQkJaWYgKCEoZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlnZXRUYXJnZXQoKTsNCi0JCWlmIChpc091dHNpZGVJbldzKHNlaSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKQ0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRToNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJcmV0dXJuICFzZWkuaXNJbXBsaWNpdCgpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPdXRzaWRlSW5XcyhJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSkgDQotCXsJCQ0KLQkJZm9yIChJV2ViU2VydmljZSB3ZWJTZXJ2aWNlIDogc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkpIHsNCi0JCQlpZiAod2ViU2VydmljZS5nZXRXc2RsTG9jYXRpb24oKSE9bnVsbCkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlTdGF0ZS5jbGFzcyA9PSB0eXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvV3NQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3MDNlYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotDQotLyoqDQotICoge0BsaW5rIElQcm9wZXJ0eVN0YXRlfSBhZGFwdGVyIGZvciB7QGxpbmsgSVdlYlNlcnZpY2V9IG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc1Byb3BlcnR5U3RhdGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlTdGF0ZQ0KLXsNCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VhYmxlKGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSANCi0Jew0KLQkJaWYgKCEoZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAoaXNPdXRzaWRlSW5XcygoSVdlYlNlcnZpY2UpZ2V0VGFyZ2V0KCkpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkNCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX05BTUU6IA0KLQkJCXJldHVybiB0cnVlOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FOg0KLQkJCXJldHVybiB0cnVlOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc091dHNpZGVJbldzKGZpbmFsIElXZWJTZXJ2aWNlIHdzKSANCi0Jew0KLQkJcmV0dXJuIHdzLmdldFdzZGxMb2NhdGlvbigpICE9IG51bGw7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQotCQlyZXR1cm4gSVByb3BlcnR5U3RhdGUuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NWQzZDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfQU5OT1RBVElPTjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlcy5XTV9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklBbm5vdGF0aW9uU2VyaWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5TQkFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyIGV4dGVuZHMgRWxlbWVudFN5bmNocm9uaXplckltcGwNCi17DQotCXByaXZhdGUgUGFyYW1ldGVyU3luY2hyb25pemVyIHBhcmFtZXRlclN5bmNocm9uaXplciA9IG5ldyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXIodGhpcyk7DQotCQ0KLQlwcm90ZWN0ZWQgaW50ZXJmYWNlIElNZXRob2RWaXNpdG9yDQotCXsNCi0JCXZvaWQgdmlzaXQoSU1ldGhvZCBtZXRob2QsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0JfQ0KLQ0KLQlwdWJsaWMgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRFeHBvc2FibGVNZXRob2RzKElNZXRob2RWaXNpdG9yIHZpc2l0b3IsIElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZU1ldGhvZHMoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIElUeXBlIHNlaVR5cGUsIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElXZWJNZXRob2Q+IG1lcmdlZE1ldGhvZHMgPSBuZXcgTGlua2VkTGlzdDxJV2ViTWV0aG9kPigpOw0KLQkJZmluYWwgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gc2VpVHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7DQotCQlmaW5hbCBJTWV0aG9kVmlzaXRvciB2aXNpdG9yID0gbmV3IElNZXRob2RWaXNpdG9yKCkNCi0JCXsNCi0JCQlwdWJsaWMgdm9pZCB2aXNpdChJTWV0aG9kIG1ldGhvZCwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCQkJew0KLQkJCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gb2J0YWluSW5zdGFuY2Uoc2VpLCBtZXRob2QpOw0KLQkJCQlpZiAobWVyZ2VkTWV0aG9kcy5jb250YWlucyh3bSkpDQotCQkJCXsNCi0JCQkJCS8qKg0KLQkJCQkJICogY2hlY2sgd2hldGhlciB0aGlzIG1ldGhvZCBoYXMgYmVlbiBwcm9jZXNzZWQgaW4gc29tZSBvZiB0aGUgY2hpbGQgY2xhc3Nlcy4gSWYgc28NCi0JCQkJCSAqIHNraXAgaXQgYW5kIGNvbnRpbnVlLiBPbmx5IHRoZSBtZXRob2QgaW4gdGhlIGxhc3QgY2hpbGQgZGVjbGFyaW5nIHRoaXMgbWV0aG9kIG5lZWRzDQotCQkJCQkgKiB0byBiZSBwcm9jZXNzZWQgYmVjYXVzZSBlYWNoIGNoaWxkIGlzIG92ZXJyaWRpbmcgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBldmVyeSBvdmVycmlkZW4NCi0JCQkJCSAqIG1ldGhvZC4NCi0JCQkJCSAqLw0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCW1lcmdlTWV0aG9kKHdtLCBtZXRob2QsIGluc3BlY3Rvcik7DQotCQkJCW1lcmdlZE1ldGhvZHMuYWRkKHdtKTsNCi0JCQl9DQotCQl9Ow0KLQkJdmlzaXRFeHBvc2FibGVNZXRob2RzKHZpc2l0b3IsIGhpZXJhcmNoeSwgaW5zcGVjdG9yKTsNCi0JCXJlbW92ZUxlZnRNZXRob2RzKHNlaSwgbWVyZ2VkTWV0aG9kcyk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIG9idGFpbkluc3RhbmNlKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKElXZWJNZXRob2Qgd20gOiBzZWkuZ2V0V2ViTWV0aG9kcygpKQ0KLQkJew0KLQkJCWlmICh1dGlsKCkuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkuZXF1YWxzKHdtLmdldEltcGxlbWVudGF0aW9uKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdtOw0KLQkJCX0NCi0JCX0NCi0JCWZpbmFsIElXZWJNZXRob2QgbmV3V2ViTWV0aG9kID0gZG9tRmFjdG9yeSgpLmNyZWF0ZUlXZWJNZXRob2QoKTsNCi0JCXNlaS5nZXRXZWJNZXRob2RzKCkuYWRkKG5ld1dlYk1ldGhvZCk7DQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKG5ld1dlYk1ldGhvZCwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fSU1QTEVNRU5UQVRJT04sIHV0aWwoKS5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlyZXR1cm4gbmV3V2ViTWV0aG9kOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBtZXJnZU1ldGhvZChJV2ViTWV0aG9kIHdtLCBJTWV0aG9kIG0sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiB3bUFubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChtLCBXTV9BTk5PVEFUSU9OKTsNCi0JCWZpbmFsIGJvb2xlYW4gZXhjbHVkZWQ7DQotCQlmaW5hbCBTdHJpbmcgbmFtZTsNCi0JCWlmICh3bUFubm90YXRpb24gPT0gbnVsbCkNCi0JCXsNCi0JCQlleGNsdWRlZCA9IGZhbHNlOw0KLQkJCW5hbWUgPSBtLmdldEVsZW1lbnROYW1lKCk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlleGNsdWRlZCA9IHdtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdNX0VYQ0xVREVEX0FUVFJJQlVURSkgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi5wYXJzZUJvb2xlYW4od21Bbm5vdGF0aW9uDQotCQkJCQkJCQkJCQkuZ2V0UHJvcGVydHlWYWx1ZShXTV9FWENMVURFRF9BVFRSSUJVVEUpKTsNCi0JCQluYW1lID0gd21Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01fTkFNRV9BVFRSSUJVVEUpID09IG51bGwgPyBtLmdldEVsZW1lbnROYW1lKCkgOiB3bUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTV9OQU1FX0FUVFJJQlVURSk7DQotCQl9DQotCQlpZiAoIW5hbWUuZXF1YWxzKHdtLmdldE5hbWUoKSkpDQotCQl7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3bSwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fTkFNRSwgbmFtZSk7DQotCQl9DQotCQlpZiAoZXhjbHVkZWQgIT0gd20uaXNFeGNsdWRlZCgpKQ0KLQkJew0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUod20sIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVELCBleGNsdWRlZCk7DQotCQl9DQotCQltZXJnZVNvYXBCaW5kaW5nKHdtLCBtLCBpbnNwZWN0b3IpOw0KLQkJcGFyYW1ldGVyU3luY2hyb25pemVyLnN5bmNocm9uaXplUGFyYW1ldGVycyh3bSwgbSwgaW5zcGVjdG9yKTsNCi0JCQ0KLQkJcmVzb3VyY2UoKS5nZXRTZXJpYWxpemVyRmFjdG9yeSgpLmFkYXB0KHdtLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHdtLCBXTV9BTk5PVEFUSU9OLCB3bUFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgbWVyZ2VTb2FwQmluZGluZyhmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBzYkFubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChtZXRob2QsIFNCX0FOTk9UQVRJT04pOw0KLQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IHNlaVNiQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShTQl9BTk5PVEFUSU9OKTsNCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdTdHlsZSBzdHlsZSA9IGRlZmluZVNCU3R5bGUoc2JBbm5vdGF0aW9uLCBzZWlTYkFubm90YXRpb24pOw0KLQkJaWYgKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCkgIT0gc3R5bGUpIHsNCi0JCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShzdHlsZSk7DQotCQl9DQotCQkNCi0JCWZpbmFsIFNPQVBCaW5kaW5nVXNlIHVzZSA9IGRlZmluZVNCVXNlKHNiQW5ub3RhdGlvbiwgc2VpU2JBbm5vdGF0aW9uKTsNCi0JCWlmICh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKSAhPSB1c2UpIHsNCi0JCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdVc2UodXNlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBwYXJhbVN0eWxlID1kZWZpbmVTQlBhcmFtZXRlclN0eWxlKHNiQW5ub3RhdGlvbiwgc2VpU2JBbm5vdGF0aW9uKTsNCi0JCWlmICh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpICE9IHBhcmFtU3R5bGUpIHsNCi0JCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShwYXJhbVN0eWxlKTsNCi0JCX0NCi0JCQ0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHdlYk1ldGhvZCwgU0JfQU5OT1RBVElPTiwgc2JBbm5vdGF0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1N0eWxlIGRlZmluZVNCU3R5bGUoZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gbWV0aG9kU0JBbm5vdGF0aW9uLCBmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2VpU2JBbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBtZXRob2RTQkFubm90YXRpb24hPW51bGwgPyBtZXRob2RTQkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5TVFlMRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmKHZhbHVlPT1udWxsKSB7DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlN0eWxlKHNlaVNiQW5ub3RhdGlvbik7DQotCQl9DQotCQkNCi0JCWlmIChTQkFubm90YXRpb25GZWF0dXJlcy5TQl9TVFlMRV9SUEMuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nU3R5bGUuUlBDOw0KLQkJfSANCi0JCQ0KLQkJaWYoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfU1RZTEVfRE9DVU1FTlQuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQ7DQotCQl9DQotCQkJDQotCQlyZXR1cm4gZGVmQ2FsYygpLmRlZmluZVNCU3R5bGUoc2VpU2JBbm5vdGF0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1VzZSBkZWZpbmVTQlVzZShmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RTQkFubm90YXRpb24sIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBzZWlTYkFubm90YXRpb24pIA0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBtZXRob2RTQkFubm90YXRpb24hPW51bGwgPyBtZXRob2RTQkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5VU0VfQVRUUklCVVRFKSA6IG51bGw7DQotCQlpZiAodmFsdWU9PW51bGwpIHsJCQ0KLQkJCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JVc2Uoc2VpU2JBbm5vdGF0aW9uKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1VTRV9FTkNPREVELmVuZHNXaXRoKHZhbHVlKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1VzZS5FTkNPREVEOw0KLQkJfQ0KLQkJDQotCQlpZiAoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfVVNFX0xJVEVSQUwuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nVXNlLkxJVEVSQUw7DQotCQl9DQotCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JVc2Uoc2VpU2JBbm5vdGF0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGRlZmluZVNCUGFyYW1ldGVyU3R5bGUoZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gbWV0aG9kU0JBbm5vdGF0aW9uLCBmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2VpU2JBbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBtZXRob2RTQkFubm90YXRpb24hPW51bGwgPyBtZXRob2RTQkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5QQVJBTUVURVJfU1RZTEVfQVRUUklCVVRFKSA6IG51bGw7DQotCQlpZiAodmFsdWU9PW51bGwpIHsNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmRlZmluZVNCUGFyYW1ldGVyU3R5bGUoc2VpU2JBbm5vdGF0aW9uKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1BBUkFNRVRFUl9TVFlMRV9CQVJFLmVuZHNXaXRoKHZhbHVlKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkU7DQotCQl9DQotCQkNCi0JCWlmIChTQkFubm90YXRpb25GZWF0dXJlcy5TQl9QQVJBTUVURVJfU1RZTEVfV1JBUFBFRC5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOw0KLQkJfQkJDQotCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShzZWlTYkFubm90YXRpb24pOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVMZWZ0TWV0aG9kcyhJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgQ29sbGVjdGlvbjxJV2ViTWV0aG9kPiBtZXJnZWRNZXRob2RzKQ0KLQl7DQotCQlmaW5hbCBJdGVyYXRvcjxJV2ViTWV0aG9kPiBpdGVyID0gc2VpLmdldFdlYk1ldGhvZHMoKS5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWlmICghbWVyZ2VkTWV0aG9kcy5jb250YWlucyhpdGVyLm5leHQoKSkpDQotCQkJew0KLQkJCQlpdGVyLnJlbW92ZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWMyMzMzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQ29tcGlsYXRpb25Vbml0SGFuZGxlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplciBpbXBsZW1lbnRzIElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXINCi17DQotCXByaXZhdGUgZmluYWwgU2VpU3luY2hyb25pemVyIHNlaUxvYWRlcjsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBXc1N5bmNocm9uaXplciB3c0xvYWRlcjsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQ0KLQlwcml2YXRlIElET00gZG9tQmVpbmdMb2FkZWQ7DQotDQotCXByaXZhdGUgZmluYWwgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YTsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBEb21VdGlsIHV0aWw7DQotDQotCXB1YmxpYyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UsIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGEpDQotCXsNCi0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsNCi0JCXRoaXMudXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCQl0aGlzLnNlcnZpY2VEYXRhID0gc2VydmljZURhdGE7DQotCQl0aGlzLnNlaUxvYWRlciA9IG5ldyBTZWlTeW5jaHJvbml6ZXIodGhpcyk7DQotCQl0aGlzLndzTG9hZGVyID0gbmV3IFdzU3luY2hyb25pemVyKHRoaXMpOw0KLQl9DQotDQotCXB1YmxpYyBEb21GYWN0b3J5IGRvbUZhY3RvcnkoKQ0KLQl7DQotCQlyZXR1cm4gRG9tRmFjdG9yeS5lSU5TVEFOQ0U7DQotCX0NCi0NCi0JcHVibGljIElET00gZ2V0RG9tQmVpbmdMb2FkZWQoKQ0KLQl7DQotCQlpZiAoZG9tQmVpbmdMb2FkZWQgPT0gbnVsbCkNCi0JCXsNCi0JCQlkb21CZWluZ0xvYWRlZCA9IGRvbUZhY3RvcnkoKS5jcmVhdGVJRE9NKCk7DQotCQl9DQotCQlyZXR1cm4gZG9tQmVpbmdMb2FkZWQ7DQotCX0NCi0NCi0JcHVibGljIElKYXZhTW9kZWwgamF2YU1vZGVsKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlLmphdmFNb2RlbCgpOw0KLQl9DQotDQotCXB1YmxpYyBJTG9nZ2VyIGxvZ2dlcigpDQotCXsNCi0JCXJldHVybiByZXNvdXJjZS5sb2dnZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSgpDQotCXsNCi0JCXJldHVybiByZXNvdXJjZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSgpDQotCXsNCi0JCXJldHVybiBzZXJ2aWNlRGF0YTsNCi0JfQ0KLQ0KLQlwdWJsaWMgRG9tVXRpbCB1dGlsKCkNCi0Jew0KLQkJcmV0dXJuIHV0aWw7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbXBpbGF0aW9uVW5pdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRyeSB7DQotCQkJcmVzb3VyY2UuZGlzYWJsZVNhdmluZygpOw0KLQkJCQ0KLQkJCWlmIChjdS5maW5kUHJpbWFyeVR5cGUoKSA9PSBudWxsIHx8ICEoY3UuZmluZFByaW1hcnlUeXBlKCkuaXNJbnRlcmZhY2UoKSB8fCBjdS5maW5kUHJpbWFyeVR5cGUoKS5pc0NsYXNzKCkpKQ0KLQkJCXsNCi0JCQkJaWYgKGxvZ2dlcigpLmlzRGVidWcoKSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoIm5vIHByaW1hcnkgdHlwZSBpbiBjb21waWxhdGlvbiB1bml0IiArIGN1LmdldFBhdGgoKS50b09TU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQlyZXR1cm47DQotCQkJfSANCi0JCQkJCQkNCi0JCQlmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IgPSByZXNvdXJjZSgpLm5ld0Fubm90YXRpb25JbnNwZWN0b3IoY3UuZmluZFByaW1hcnlUeXBlKCkpOw0KLQkJCWZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdFR5cGUoV1NfQU5OT1RBVElPTik7DQotCQkJaWYgKHdzQW5ub3RhdGlvbiA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJaWYgKGxvZ2dlcigpLmlzRGVidWcoKSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoIm5vICIgKyBXU19BTk5PVEFUSU9OICsgIiBhbm5vdGF0aW9uIGZvdW5kIG9uIHR5cGUgIiArIGN1LmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJA0KLQkJCQl9DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJcmVjb3JkSGllcmFyY2h5KGN1LmZpbmRQcmltYXJ5VHlwZSgpKTsNCi0JCQkNCi0JCQlpZiAod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuaXNJbnRlcmZhY2UoKSkNCi0JCQl7DQotCQkJCS8vIGhhbmRsZSBjbGFzcyBjaGFuZ2VkIHRvIGludGVyZmFjZQ0KLQkJCQlyZW1vdmVXc01vZGVsRWxlbWVudHMod3NQcm9qZWN0LCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgZmFsc2UpOw0KLQkJCQkNCi0JCQkJc2VpTG9hZGVyLnN5bmNocm9uaXplSW50ZXJmYWNlKHdzUHJvamVjdCwgd3NBbm5vdGF0aW9uLCBpbnNwZWN0b3IpOw0KLQkJCX0gZWxzZSBpZiAod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuaXNDbGFzcygpKQ0KLQkJCXsNCi0JCQkJLy8gaGFuZGxlIGludGVyZmFjZSBjaGFuZ2VkIHRvIGNsYXNzDQotCQkJCXJlbW92ZVNlaU1vZGVsRWxlbWVudHMod3NQcm9qZWN0LCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgZmFsc2UsIHRydWUpOw0KLQkJCQkNCi0JCQkJLy8gaWYgdGhlIGFubm90YXRpb24gaGFzIGNoYW5nZWQgYW5kIGVuZHBvaW50SW50ZXJmYWNlIGhhcyBiZWVuIGFkZGVkIHRoZSBleGlzdGluZw0KLQkJCQkvLyBTRUkgaW4gdGhlIHByb2plY3Qgc2hvdWxkIGJlIHJlbW92ZWQNCi0JCQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSB3c0xvYWRlci5zeW5jaHJvbml6ZVdlYlNlcnZpY2Uod3NQcm9qZWN0LCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7DQotCQkJCWlmICh3cyE9bnVsbCAmJiAod3MuZ2V0U2VydmljZUVuZHBvaW50KCk9PW51bGwgfHwgIXdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmlzSW1wbGljaXQoKSkpIHsNCi0JCQkJCXJlbW92ZVNlaU1vZGVsRWxlbWVudHMod3NQcm9qZWN0LCB3cy5nZXRJbXBsZW1lbnRhdGlvbigpLCBmYWxzZSwgZmFsc2UpOw0KLQkJCQl9DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlpZiAobG9nZ2VyKCkuaXNEZWJ1ZygpKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dEZWJ1ZygiYW5ub3RhdGlvbiAiICsgV1NfQU5OT1RBVElPTiArICIgaXMgcHV0IG9uIHR5cGUgIi8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkDQotCQkJCQkJCQkJKyB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKQ0KLQkJCQkJCQkJCSsgIndoaWNoIGlzIG5laXRoZXIgaW50ZXJmYWNlLCBub3IgYSBjbGFzcy4gSWdub3JyaW5nISIpOy8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCX0JCQkNCi0JCX0gZmluYWxseSB7DQotCQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIHdlYiBzZXJ2aWNlcyBmcm9tIHRoZSBtb2RlbC4NCi0JICogQHBhcmFtIHdzUHJvamVjdA0KLQkgKiBAcGFyYW0gaW1wbEJhc2VOYW1lDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVXc01vZGVsRWxlbWVudHMoZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgZmluYWwgU3RyaW5nIGltcGxCYXNlTmFtZSwgZmluYWwgYm9vbGVhbiBpc0ZvclBhY2thZ2UpIA0KLQl7DQotCQlmaW5hbCBJdGVyYXRvcjxJV2ViU2VydmljZT4gd3NJdGVyID0gd3NQcm9qZWN0LmdldFdlYlNlcnZpY2VzKCkuaXRlcmF0b3IoKTsNCi0JCXdoaWxlICh3c0l0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gd3NJdGVyLm5leHQoKTsNCi0JCQlpZiAod3MuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbEJhc2VOYW1lKSB8fCANCi0JCQkJKGlzRm9yUGFja2FnZSAmJiB3cy5nZXRJbXBsZW1lbnRhdGlvbigpLnN0YXJ0c1dpdGgoaW1wbEJhc2VOYW1lKSkpDQotCQkJew0KLQkJCQlzZXJ2aWNlRGF0YSgpLmNsZWFySGllcmFyY2h5KHdzLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJCQl3c0l0ZXIucmVtb3ZlKCk7DQotCQkJCWlmICh3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSAhPSBudWxsKQ0KLQkJCQl7DQotCQkJCQl3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLnJlbW92ZSh3cyk7DQotCQkJCX0NCi0JCQkJc2VydmljZURhdGEoKS51bm1hcCh3cyk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlcyBTRUkncyB3aXRoIDxjb2RlPmltcGxCYXNlTmFtZTwvY29kZT4gaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgbW9kZWwuDQotCSAqIEBwYXJhbSB3c1Byb2plY3QNCi0JICogQHBhcmFtIGltcGxCYXNlTmFtZQ0KLQkgKiBAcGFyYW0gb25seUV4cGxpY2l0IGlmIDxjb2RlPnRydWU8L2NvZGU+IGltcGxpY2l0IGludGVyZmFjZXMgYXJlIG5vdCByZW1vdmVkIGZyb20gbW9kZWwsIG90aGVyd2lzZSBib3RoIGFyZSByZW1vdmVkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyhmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBmaW5hbCBTdHJpbmcgaW1wbEJhc2VOYW1lLCBmaW5hbCBib29sZWFuIGlzRm9yUGFja2FnZSwgZmluYWwgYm9vbGVhbiBvbmx5RXhwbGljaXQpIA0KLQl7DQotCQlmaW5hbCBJdGVyYXRvcjxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBzZWlJdGVyID0gd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKHNlaUl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gc2VpSXRlci5uZXh0KCk7DQotCQkJaWYgKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsQmFzZU5hbWUpIHx8DQotCQkJCShpc0ZvclBhY2thZ2UgJiYgc2VpLmdldEltcGxlbWVudGF0aW9uKCkuc3RhcnRzV2l0aChpbXBsQmFzZU5hbWUpKSkNCi0JCQl7DQotCQkJCWlmICgob25seUV4cGxpY2l0ICYmIHNlaS5pc0ltcGxpY2l0KCkpKSB7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQlzZXJ2aWNlRGF0YSgpLmNsZWFySGllcmFyY2h5KHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCQkJc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCQkJc2VpSXRlci5yZW1vdmUoKTsNCi0JCQl9DQotCQl9DQotCX0JDQotDQotCXZvaWQgcmVjb3JkSGllcmFyY2h5KElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgQ29sbGVjdGlvbjxJQ29tcGlsYXRpb25Vbml0PiBjb21waWxhdGlvblVuaXRzID0gbmV3IExpbmtlZExpc3Q8SUNvbXBpbGF0aW9uVW5pdD4oKTsNCi0JCQ0KLQkJZm9yIChJVHlwZSBzdXBlclR5cGUgOiB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKS5nZXRBbGxTdXBlcnR5cGVzKHR5cGUpKSB7DQotCQkJY29tcGlsYXRpb25Vbml0cy5hZGQoc3VwZXJUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpKTsNCi0JCX0NCi0JCQkNCi0JCXNlcnZpY2VEYXRhKCkucmVjb3JkSGllcmFyY2h5KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIGNvbXBpbGF0aW9uVW5pdHMpOw0KLQl9DQotDQotDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgY3JlYXRlUHJvamVjdChmaW5hbCBJSmF2YVByb2plY3QganByaikNCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHRoaXNQcm9qZWN0ID0gZG9tRmFjdG9yeSgpLmNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdCgpOw0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh0aGlzUHJvamVjdCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSwganByai5nZXRFbGVtZW50TmFtZSgpKTsNCi0NCi0JCXV0aWwoKS5hZGRUb0NvbGxlY3Rpb25GZWF0dXJlKGdldERvbUJlaW5nTG9hZGVkKCksIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMsIHRoaXNQcm9qZWN0KTsNCi0JCXJldHVybiB0aGlzUHJvamVjdDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTG9hZGVyQ29tcGlsYXRpb25Vbml0SGFuZGxlciBpbXBsZW1lbnRzIElDb21waWxhdGlvblVuaXRIYW5kbGVyDQotCXsNCi0JCXB1YmxpYyB2b2lkIHN0YXJ0ZWQoKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgZmluaXNoZWQoKQ0KLQkJew0KLQkJCXJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoZ2V0RG9tQmVpbmdMb2FkZWQoKSk7DQotCQl9DQotDQotCQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDsNCi0NCi0JCXB1YmxpYyB2b2lkIGhhbmRsZShmaW5hbCBJSmF2YVByb2plY3QganByaikNCi0JCXsNCi0JCQl3c1Byb2plY3QgPSBjcmVhdGVQcm9qZWN0KGpwcmopOw0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgaGFuZGxlKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpDQotCQl7DQotCQkJdHJ5DQotCQkJew0KLQkJCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJvamVjdCwgY3UpOw0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHBhcnNlIHRoZSBjb250ZW50IG9mIGNvbXBpbGF0aW9uIHVuaXQiICsgY3UuZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSwgam1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvRWxlbWVudFN5bmNocm9uaXplckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9FbGVtZW50U3luY2hyb25pemVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjgxOTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9FbGVtZW50U3luY2hyb25pemVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi0NCi1jbGFzcyBFbGVtZW50U3luY2hyb25pemVySW1wbCBpbXBsZW1lbnRzIElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXINCi17DQotDQotCXByaXZhdGUgZmluYWwgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQ7DQotCXByaXZhdGUgZmluYWwgRG9tVXRpbCB1dGlsOw0KLQlwcml2YXRlIGZpbmFsIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIGRlZmF1bHRzQ2FsY3VsYXRvcjsNCi0JDQotCUVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50KQ0KLQl7DQotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsNCi0JCXV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQkJZGVmYXVsdHNDYWxjdWxhdG9yID0gbmV3IEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yKCk7DQotCX0NCi0JDQotCXB1YmxpYyBEb21VdGlsIHV0aWwoKSB7DQotCQlyZXR1cm4gdXRpbDsNCi0JfQ0KLQkNCi0JcHVibGljIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIGRlZkNhbGMoKSB7DQotCQlyZXR1cm4gZGVmYXVsdHNDYWxjdWxhdG9yOw0KLQl9DQotCQ0KLQlwdWJsaWMgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQuc2VydmljZURhdGEoKTsNCi0JfQ0KLQkNCi0JcHVibGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmVudC5sb2dnZXIoKTsNCi0JfQ0KLQkNCi0JcHVibGljIElET00gZ2V0RG9tQmVpbmdMb2FkZWQoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LmdldERvbUJlaW5nTG9hZGVkKCk7DQotCX0NCi0JDQotCXB1YmxpYyBEb21GYWN0b3J5IGRvbUZhY3RvcnkoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LmRvbUZhY3RvcnkoKTsNCi0JfQ0KLQkNCi0JcHVibGljIElKYXZhTW9kZWwgamF2YU1vZGVsKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmVudC5qYXZhTW9kZWwoKTsNCi0JfQ0KLQkNCi0JcHVibGljIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LnJlc291cmNlKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGFkYXB0VG9Mb2NhdGlvbkludGVyZmFjZShmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIGFubkZRTmFtZSwgZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbikNCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb25BZGFwdGVyIGxvY2F0b3IgPSAoSUFubm90YXRpb25BZGFwdGVyKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChvYmplY3QsIElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcyk7DQotCQlsb2NhdG9yLmFkZEFubm90YXRpb24oYW5uRlFOYW1lLCBhbm5vdGF0aW9uKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvSW5pdGlhbE1vZGVsU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvSW5pdGlhbE1vZGVsU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRiYjAxYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0luaXRpYWxNb2RlbFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YTsNCi0NCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE1vZGVsU3luY2hyb25pemVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplcg0KLXsNCi0JcHVibGljIEluaXRpYWxNb2RlbFN5bmNocm9uaXplcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlLCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKQ0KLQl7DQotCQlzdXBlcihyZXNvdXJjZSwgc2VydmljZURhdGEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwPD8sPz4gb3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQlyZXNvdXJjZSgpLmRpc2FibGVTYXZpbmcoKTsJCQkNCi0JCQlyZXNvdXJjZSgpLm5ld0NvbXBpbGF0aW9uVW5pdEZpbmRlcihyZXNvdXJjZSgpLmphdmFNb2RlbCgpLCByZXNvdXJjZSgpLmdldFByb2plY3RTZWxlY3RvcnMoKSkuDQotCQkJCWZpbmQobW9uaXRvciwgbmV3IExvYWRlckNvbXBpbGF0aW9uVW5pdEhhbmRsZXIoKSk7DQotCQl9IGZpbmFsbHkgew0KLQkJCXJlc291cmNlKCkuZW5hYmxlU2F2aW5nKCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL09uRXZlbnRNb2RlbFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL09uRXZlbnRNb2RlbFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MmVjZTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9PbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQ29tcGlsYXRpb25Vbml0RmluZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSVByb2plY3RTZWxlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5Xb3Jrc3BhY2VDVUZpbmRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2UuU2VydmljZU1vZGVsRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXINCi17DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgSURPTSBnZXREb21CZWluZ0xvYWRlZCgpDQotCXsNCi0JCXJldHVybiByZXNvdXJjZSgpLmdldERPTSgpOw0KLQl9DQotDQotCXB1YmxpYyBPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSwgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSkNCi0Jew0KLQkJc3VwZXIocmVzb3VyY2UsIHNlcnZpY2VEYXRhKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChmaW5hbCBFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlpZiAobG9nZ2VyKCkuaXNEZWJ1ZygpKQ0KLQkJCXsNCi0JCQkJbG9nZ2VyKCkubG9nRGVidWcoIkVsZW1lbnRDaGFuZ2VkRXZlbnQgaGFzIGJlZW4gZGVsaXZlcmVkLiBFdmVudCBkZXRhaWxzOiAiICsgZXZlbnQudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQkNCi0JCQkvLyBubyBwcm9jZXNzaW5nIGlmIERPTSBsb2FkIGhhcyBiZWVuIGNhbmNlbGVkDQotCQkJaWYgKHJlc291cmNlKCkuaXNMb2FkQ25hY2VsZWQoKSkgew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCXJlc291cmNlKCkuZGlzYWJsZVNhdmluZygpOw0KLQkJCQ0KLQkJCS8vIGhhbmRsZXMgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRSAtIHRoZSBjYXNlIHdoZW4gdGhlIGVkaXRvciBzZW5kcyByZWNvbmNpbGUgZXZlbnQNCi0JCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9SRUNPTkNJTEUpDQotCQkJew0KLQkJCQloYW5kbGVSZWNvbmNpbGVFdmVudChldmVudCk7DQotCQkJfQ0KLQ0KLQkJCS8vIGhhbmRsZXMgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSAtIHRoZSBjYXNlIHdoZW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGFzIGJlZW4gY2hhbmdlZA0KLQkJCWlmIChldmVudC5nZXREZWx0YSgpLmdldEVsZW1lbnQoKSAhPSByZXNvdXJjZSgpLmphdmFNb2RlbCgpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlhc3NlcnQgKGV2ZW50LmdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIChJSmF2YUVsZW1lbnREZWx0YS5GX0NISUxEUkVOIHwgSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UKSkgIT0gMDsNCi0JCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkIDogZXZlbnQuZ2V0RGVsdGEoKS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpDQotCQkJew0KLQkJCQlpZiAoY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KQ0KLQkJCQl7DQotCQkJCQloYW5kbGVDaGFuZ2VkUHJvamVjdChjaGlsZCk7DQotCQkJCX0NCi0JCQl9DQotCQl9IA0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHN5bmNocm9uaXplIFdlYiBTZXJ2aWNlIG1vZGVsIHVwb24gamF2YSBlbGVtZW50IGRlbHRhICIrIGV2ZW50LmdldERlbHRhKCksIGNlKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSANCi0JCWNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuYWJsZSB0byBzeW5jaHJvbml6ZSBXZWIgU2VydmljZSBtb2RlbCB1cG9uIGphdmEgZWxlbWVudCBkZWx0YSAiICsgZXZlbnQuZ2V0RGVsdGEoKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gDQotCQlmaW5hbGx5IHsNCi0JCQlyZXNvdXJjZSgpLmVuYWJsZVNhdmluZygpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGVFdmVudChmaW5hbCBFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmKCEoZXZlbnQuZ2V0RGVsdGEoKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0ICkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWludCByZXF1aXJlZEZsYWdzID0gSUphdmFFbGVtZW50RGVsdGEuRl9DT05URU5UIHwgSUphdmFFbGVtZW50RGVsdGEuRl9DSElMRFJFTjsNCi0JCQ0KLQkJaWYgKChldmVudC5nZXREZWx0YSgpLmdldEZsYWdzKCkgJiByZXF1aXJlZEZsYWdzKSA9PSAwKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KWV2ZW50LmdldERlbHRhKCkuZ2V0RWxlbWVudCgpOw0KLQkJaWYgKCFyZXNvdXJjZSgpLmFwcHJvdmVQcm9qZWN0KGN1LmdldEphdmFQcm9qZWN0KCkpKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJaWYgKGlzSmF2YVJlc291cmNlKGN1KSkgew0KLQkJCWhhbmRsZUNoYW5nZWRDb250ZW50Q29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGlzSmF2YVJlc291cmNlKElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IGN1Ow0KLQkJd2hpbGUgKChqYXZhRWxlbWVudCA9IGphdmFFbGVtZW50LmdldFBhcmVudCgpKSAhPSBudWxsKSANCi0JCXsNCi0JCQlpZiAoIWphdmFFbGVtZW50LmV4aXN0cygpKSB7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQl2b2lkIGhhbmRsZUNoYW5nZWRQcm9qZWN0KElKYXZhRWxlbWVudERlbHRhIHByb2plY3REZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydCAocHJvamVjdERlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCk7DQotCQ0KLQkJaWYgKCgoKHByb2plY3REZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTE9TRUQpICE9IDApIHx8IHByb2plY3REZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCkNCi0JCQkmJiBudWxsICE9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCkpKQ0KLQkJew0KLQkJCS8vaWYgdGhlIHByb2plY3QgaGFzIGJlZW4gY2xvc2VkIHRoZW4gaXQncyBmYWNldCdzIGNvdWxkIG5vdCBiZSByZWFkLiBUaHVzIHRoZSBhcHByb3ZlIG1ldGhvZA0KLQkJCS8vd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLiBUaGF0J3Mgd2h5IHdlIGNoZWNrIGlmIHRoZSBwcm9qZWN0IGhhcyBhbHJlYWR5IGJlZW4gaW4gdGhlIA0KLQkJCWhhbmRsZUNsb3NlZFByb2plY3QocHJvamVjdERlbHRhKTsNCi0JCX0NCi0JCWlmICghcmVzb3VyY2UoKS5hcHByb3ZlUHJvamVjdCgoSUphdmFQcm9qZWN0KXByb2plY3REZWx0YS5nZXRFbGVtZW50KCkpKQ0KLQkJew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCWlmICgoKHByb2plY3REZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9PUEVORUQpICE9IDApIHx8IHByb2plY3REZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpDQotCQl7DQotCQkJaGFuZGxlT3BlbmVkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJfQ0KLQkNCi0JCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGREZWx0YSA6IHByb2plY3REZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpDQotCQl7DQotCQkJaWYgKCEoY2hpbGREZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkpDQotCQkJew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJaWYgKChjaGlsZERlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSCkgIT0gMCkNCi0JCQl7DQotCQkJCWhhbmRsZUNsb3NlZFByb2plY3QocHJvamVjdERlbHRhKTsNCi0JCQkJaGFuZGxlT3BlbmVkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJCX0NCi0JCQlpZiAoKGNoaWxkRGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgIT0gMCkNCi0JCQl7DQotCQkJCWhhbmRsZUNsb3NlZFByb2plY3QocHJvamVjdERlbHRhKTsNCi0JCQkJaGFuZGxlT3BlbmVkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJCX0NCi0JCQlpZiAoKGNoaWxkRGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pICE9IDApDQotCQkJew0KLQkJCQlyZWN1cnNldmlseUhhbmRsZVJlbW92ZWRQYWNrYWdlcyhjaGlsZERlbHRhKTsNCi0JCQkJcmVjdXJzZXZpbHlIYW5kbGVBZGRlZFBhY2thZ2VzKGNoaWxkRGVsdGEpOw0KLQkJCQlyZWN1cnNldmlseUhhbmRsZUNvbXBpbGF0aW9uVW5pdHMoY2hpbGREZWx0YSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCByZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMoSUphdmFFbGVtZW50RGVsdGEgcm9vdERlbHRhKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IGZpbmRQcm9qZWN0QnlEZWx0YShyb290RGVsdGEpOw0KLQkJaWYgKHdzUHJqID09IG51bGwpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGREZWx0YSA6IHJvb3REZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpDQotCQl7DQotCQkJaWYgKGNoaWxkRGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCAmJiBjaGlsZERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCkNCi0JCQl7DQotCQkJCWZvciAoSUNvbXBpbGF0aW9uVW5pdCBjdSA6ICgoSVBhY2thZ2VGcmFnbWVudCljaGlsZERlbHRhLmdldEVsZW1lbnQoKSkuZ2V0Q29tcGlsYXRpb25Vbml0cygpKQ0KLQkJCQl7DQotCQkJCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJqLCBjdSk7DQotCQkJCX0NCi0JCQkJcmVjdXJzZXZpbHlIYW5kbGVBZGRlZFBhY2thZ2VzKGNoaWxkRGVsdGEpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGZpbmRQcm9qZWN0QnlEZWx0YShJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEpIHsNCi0JCXJldHVybiB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgcm9vdERlbHRhLmdldEVsZW1lbnQoKS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcmVjdXJzZXZpbHlIYW5kbGVSZW1vdmVkUGFja2FnZXMoSUphdmFFbGVtZW50RGVsdGEgcm9vdERlbHRhKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCQ0KLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogcm9vdERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCXsNCi0JCQlpZiAoY2hpbGREZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KQ0KLQkJCXsNCi0JCQkJaWYgKGNoaWxkRGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpDQotCQkJCXsNCi0JCQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IGZpbmRQcm9qZWN0QnlEZWx0YShyb290RGVsdGEpOw0KLQkJCQkJaWYgKHdzUHJqICE9IG51bGwpIHsNCi0JCQkJCQlyZW1vdmVNb2RlbEVsZW1lbnRzKHdzUHJqLCBjaGlsZERlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpLCB0cnVlKTsNCi0JCQkJCX0NCi0JCQkJfSBlbHNlDQotCQkJCXsNCi0JCQkJCXJlY3Vyc2V2aWx5SGFuZGxlUmVtb3ZlZFBhY2thZ2VzKGNoaWxkRGVsdGEpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVPcGVuZWRQcm9qZWN0KElKYXZhRWxlbWVudERlbHRhIHByb2plY3REZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydCBwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0Ow0KLQkJZmluYWwgSUphdmFQcm9qZWN0IGNoYW5nZWRQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcHJvamVjdERlbHRhLmdldEVsZW1lbnQoKTsNCi0JCW5ld1Byb2plY3RDVUZpbmRlcihjaGFuZ2VkUHJvamVjdCkuZmluZChudWxsLCBuZXcgTG9hZGVyQ29tcGlsYXRpb25Vbml0SGFuZGxlcigpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2xvc2VkUHJvamVjdChJSmF2YUVsZW1lbnREZWx0YSBwcm9qZWN0RGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydCBwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0Ow0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqID0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlpZiAod3NQcmo9PW51bGwpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWZvciAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgOiB3c1Byai5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpDQotCQl7DQotCQkJc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCX0NCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byai5nZXRXZWJTZXJ2aWNlcygpKQ0KLQkJew0KLQkJCXNlcnZpY2VEYXRhKCkudW5tYXAod3MpOw0KLQkJfQ0KLQkJZ2V0RG9tQmVpbmdMb2FkZWQoKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5yZW1vdmUod3NQcmopOw0KLQl9DQotDQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBuZXdQcm9qZWN0Q1VGaW5kZXIoZmluYWwgSUphdmFQcm9qZWN0IHByaikNCi0Jew0KLQkJcmV0dXJuIG5ldyBXb3Jrc3BhY2VDVUZpbmRlcihyZXNvdXJjZSgpLmphdmFNb2RlbCgpLCBuZXcgSVByb2plY3RTZWxlY3RvcltdIHsgbmV3IElQcm9qZWN0U2VsZWN0b3IoKQ0KLQkJew0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHRvQXBwcm92ZSkNCi0JCQl7DQotCQkJCXJldHVybiBwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModG9BcHByb3ZlLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCX0NCi0JCX0gfSk7DQotCX0NCi0NCi0JLy8gaGFuZGxlcyBjb21waWxhdGlvbiB1bml0cyAtIHNraXBzIHdvcmtpbmcgY29waWVzDQotCXByaXZhdGUgdm9pZCByZWN1cnNldmlseUhhbmRsZUNvbXBpbGF0aW9uVW5pdHMoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpDQotCXsNCi0JCWlmIChkZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQ0KLQkJew0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZGVsdGEuZ2V0RWxlbWVudCgpOw0KLQkJCWlmICh1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgY3UuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKT09bnVsbCkNCi0JCQl7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJdHJ5DQotCQkJew0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEICYmIChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9NT1ZFRF9GUk9NKSA9PSAwKQ0KLQkJCQl7DQotCQkJCQloYW5kbGVBZGRlZENvbXBpbGF0aW9uVW5pdChjdSk7DQotCQkJCX0NCi0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEICYmIChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9NT1ZFRF9UTykgPT0gMCkNCi0JCQkJew0KLQkJCQkJaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChjdSk7DQotCQkJCX0NCi0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEICYmIChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9NT1ZFRF9UTykgIT0gMCkNCi0JCQkJew0KLQkJCQkJaGFuZGxlTW92ZWRUb0NvbXBpbGF0aW9uVW5pdChjdSwgKElDb21waWxhdGlvblVuaXQpIGRlbHRhLmdldE1vdmVkVG9FbGVtZW50KCkpOw0KLQkJCQl9DQotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCAmJiANCi0JCQkJCSgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9SRVNPVVJDRSkgIT0gMCkgfHwNCi0JCQkJCSgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9XT1JLSU5HX0NPUFkpICE9IDApKQ0KLQkJCQl7DQotCQkJCQloYW5kbGVDaGFuZ2VkQ29udGVudENvbXBpbGF0aW9uVW5pdChjdSk7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKQ0KLQkJCXsNCi0JCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuYWJsZSB0byBwYXJzZSB0aGUgY29udGVudCBvZiBjb21waWxhdGlvbiB1bml0IiArIGRlbHRhLmdldEVsZW1lbnQoKSwgam1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0gZWxzZQ0KLQkJew0KLQkJCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGREZWx0YSA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCQl7DQotCQkJCXJlY3Vyc2V2aWx5SGFuZGxlQ29tcGlsYXRpb25Vbml0cyhjaGlsZERlbHRhKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNoYW5nZWRDb250ZW50Q29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVR5cGUgdHlwZSA9IGN1LmZpbmRQcmltYXJ5VHlwZSgpOwkNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uID0gdHlwZT09bnVsbCA/IG51bGwgOiByZXNvdXJjZSgpLm5ld0Fubm90YXRpb25JbnNwZWN0b3IodHlwZSkuaW5zcGVjdFR5cGUoV1NfQU5OT1RBVElPTik7DQotCQlpZiAodHlwZSA9PSBudWxsIHx8IGFubm90YXRpb24gPT0gbnVsbCkNCi0JCXsNCi0JCQl1cGRhdGVTdWJjbGFzc2luZ1dTRWxlbWVudHMoY3UpOw0KLQkJCWhhbmRsZVJlbW92ZWRDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBjdS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCWFzc2VydCB3c1Byb2plY3QgIT0gbnVsbDsNCi0JCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJvamVjdCwgY3UpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB1cGRhdGVTdWJjbGFzc2luZ1dTRWxlbWVudHMoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA6IGdldERvbUJlaW5nTG9hZGVkKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkpDQotCQl7DQotCQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcmogPSBqYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdCh3c1Byai5nZXROYW1lKCkpOw0KLQkJCWZvciAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgOiB3c1Byai5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpDQotCQkJew0KLQkJCQlpZihzZXJ2aWNlRGF0YSgpLmdldEhpZXJhcmNoeShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSk9PW51bGwpIHsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCWlmIChzZXJ2aWNlRGF0YSgpLmdldEhpZXJhcmNoeShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSkuY29udGFpbnMoY3UpKQ0KLQkJCQl7DQotCQkJCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJqLCBqYXZhUHJqLmZpbmRUeXBlKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKSk7DQotCQkJCX0NCi0JCQl9DQotCQkJZm9yIChJV2ViU2VydmljZSB3cyA6IHdzUHJqLmdldFdlYlNlcnZpY2VzKCkpDQotCQkJew0KLQkJCQlpZihzZXJ2aWNlRGF0YSgpLmdldEhpZXJhcmNoeSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKT09bnVsbCkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJaWYgKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHdzLmdldEltcGxlbWVudGF0aW9uKCkpLmNvbnRhaW5zKGN1KSkNCi0JCQkJew0KLQkJCQkJcHJvY2Vzc0NvbXBpbGF0aW9uVW5pdCh3c1ByaiwgamF2YVByai5maW5kVHlwZSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFkZGVkQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgYWRkZWRDVSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmogPSB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgYWRkZWRDVS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJdGhpcy5wcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJqLCBhZGRlZENVKTsNCi0JfQ0KLQ0KLQl2b2lkIGhhbmRsZU1vdmVkVG9Db21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBmcm9tQ1UsIElDb21waWxhdGlvblVuaXQgdG9DVSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IHdzRWxlbSA9IGd1ZXNzQ29udGFpbmVkV1NFbGVtZW50KGZyb21DVSk7DQotCQlpZiAod3NFbGVtID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJZmluYWwgYm9vbGVhbiBmcU5hbWVDaGFuZ2VkID0gIXRvQ1UuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZnJvbUNVLmdldEVsZW1lbnROYW1lKCkpDQotCQkJCQkJCQkJCXx8ICF0b0NVLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGZyb21DVS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWlmIChmcU5hbWVDaGFuZ2VkKQ0KLQkJew0KLQkJCWhhbmRsZVJlbW92ZWRDb21waWxhdGlvblVuaXQoZnJvbUNVKTsNCi0JCQloYW5kbGVBZGRlZENvbXBpbGF0aW9uVW5pdCh0b0NVKTsNCi0JCX0gZWxzZQ0KLQkJLy8gdGhlbiBhc3N1bWUgdGhhdCB0aGUgcHJvamVjdCBvbmx5IGhhcyBjaGFuZ2VkLg0KLQkJew0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB0b1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCB0b0NVLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJaWYgKHdzRWxlbSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKQ0KLQkJCXsNCi0JCQkJdG9QcmouZ2V0V2ViU2VydmljZXMoKS5hZGQoKElXZWJTZXJ2aWNlKSB3c0VsZW0pOw0KLQkJCX0gZWxzZQ0KLQkJCXsNCi0JCQkJdG9QcmouZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmFkZCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgd3NFbGVtKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCByZW1DVSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmogPSB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgcmVtQ1UuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCXJlbW92ZU1vZGVsRWxlbWVudHMod3NQcmosIGd1ZXNzUHJpbWFyeVR5cGVOYW1lKHJlbUNVKSwgZmFsc2UpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVNb2RlbEVsZW1lbnRzKElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiwgU3RyaW5nIGltcGxCYXNlTmFtZSwgYm9vbGVhbiBpc0ZvclBhY2thZ2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHdzUHJqID09IG51bGwpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlyZW1vdmVXc01vZGVsRWxlbWVudHMod3NQcmosIGltcGxCYXNlTmFtZSwgaXNGb3JQYWNrYWdlKTsNCi0JCXJlbW92ZVNlaU1vZGVsRWxlbWVudHMod3NQcmosIGltcGxCYXNlTmFtZSwgaXNGb3JQYWNrYWdlLCBmYWxzZSk7DQotCX0NCi0JDQotCXByaXZhdGUgSUphdmFXZWJTZXJ2aWNlRWxlbWVudCBndWVzc0NvbnRhaW5lZFdTRWxlbWVudChJQ29tcGlsYXRpb25Vbml0IGN1KQ0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmogPSB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgY3UuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCXJldHVybiB1dGlsKCkuZmluZEphdmFXZWJTZXJ2aWNlRWxlbUJ5SW1wbE5hbWUod3NQcmosIGd1ZXNzUHJpbWFyeVR5cGVOYW1lKGN1KSk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIFN0cmluZyBndWVzc1ByaW1hcnlUeXBlTmFtZShJQ29tcGlsYXRpb25Vbml0IGN1KQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgcGFyZW50TmFtZSA9IGN1LmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGFzc3VtZWRQcmltYXJ5VHlwZU5hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KLQkJaWYgKHBhcmVudE5hbWUubGVuZ3RoKCkgPiAwKSB7DQotCQkJYXNzdW1lZFByaW1hcnlUeXBlTmFtZSAuYXBwZW5kKHBhcmVudE5hbWUpLmFwcGVuZCgnLicpOw0KLQkJfQ0KLQkJcmV0dXJuIGFzc3VtZWRQcmltYXJ5VHlwZU5hbWUuYXBwZW5kKGN1LmdldEVsZW1lbnROYW1lKCkpLg0KLQkJCWRlbGV0ZShhc3N1bWVkUHJpbWFyeVR5cGVOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpLCBhc3N1bWVkUHJpbWFyeVR5cGVOYW1lLmxlbmd0aCgpKS50b1N0cmluZygpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvUGFyYW1ldGVyU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvUGFyYW1ldGVyU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY1NTkwM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1BhcmFtZXRlclN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuSEVBREVSX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5NT0RFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5QQVJUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IHN5bmNocm9uaXplcyB0aGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIElXZWJNZXRob2R9IG9iamVjdDsNCi0gKiANCi0gKiBAYXV0aG9yIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXIgZXh0ZW5kcyBFbGVtZW50U3luY2hyb25pemVySW1wbA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTl9QQVJBTV9OQU1FCT0gInJldHVybiI7Ly8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9MREVSX0NMQVNTX05BTUUgPSAiSG9sZGVyIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9MREVSX0NMQVNTX0ZRTkFNRSA9ICJqYXZheC54bWwud3MuSG9sZGVyIjsvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgUGFyYW1ldGVyU3luY2hyb25pemVyKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50KQ0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplUGFyYW1ldGVycyhJV2ViTWV0aG9kIHdtLCBJTWV0aG9kIG1ldGhvZCwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIENvbGxlY3Rpb248SVdlYlBhcmFtPiBtZXJnZWRQYXJhbXMgPSBuZXcgTGlua2VkTGlzdDxJV2ViUGFyYW0+KCk7DQotCQlpZiAoIVNpZ25hdHVyZS5TSUdfVk9JRC5lcXVhbHMobWV0aG9kLmdldFJldHVyblR5cGUoKSkpDQotCQl7DQotCQkJZmluYWwgSVdlYlBhcmFtIHJldFBhcmFtID0gb2J0YWluSW5zdGFuY2Uod20sIFJFVFVSTl9QQVJBTV9OQU1FKTsNCi0JCQltZXJnZVBhcmFtKHJldFBhcmFtLCAwLCB3bSwgbWV0aG9kLCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBpbnNwZWN0b3IpOw0KLQkJCW1lcmdlZFBhcmFtcy5hZGQocmV0UGFyYW0pOw0KLQkJfQ0KLQkJZmluYWwgU3RyaW5nW10gbmFtZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsNCi0JCWZpbmFsIFN0cmluZ1tdIHR5cGVTaWduYXR1cmVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7IA0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlmaW5hbCBJV2ViUGFyYW0gcGFyYW0gPSBvYnRhaW5JbnN0YW5jZSh3bSwgbmFtZXNbaV0pOw0KLQkJCW1lcmdlUGFyYW0ocGFyYW0sIGksIHdtLCBtZXRob2QsIHR5cGVTaWduYXR1cmVzW2ldLCBpbnNwZWN0b3IpOw0KLQkJCW1lcmdlZFBhcmFtcy5hZGQocGFyYW0pOw0KLQkJfQ0KLQkJd20uZ2V0UGFyYW1ldGVycygpLnJldGFpbkFsbChtZXJnZWRQYXJhbXMpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBtZXJnZVBhcmFtKElXZWJQYXJhbSB3ZWJQYXJhbSwgaW50IHBvcywgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIElNZXRob2QgbWV0aG9kLCBTdHJpbmcgdHlwZVNpZ24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW0gPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcih3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydCB0eXBlUGFyYW0hPSBudWxsOw0KLQkJDQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gd3BBbm5vdGF0aW9uID0gaXNXZWJSZXN1bHQod2ViUGFyYW0pID8gbnVsbCA6IGluc3BlY3Rvci5pbnNwZWN0UGFyYW0odHlwZVBhcmFtLCBXUF9BTk5PVEFUSU9OKTsNCi0JCQkJDQotCQlpZiAoISB0eXBlU2lnbi5lcXVhbHMod2ViUGFyYW0uZ2V0VHlwZU5hbWUoKSkpIHsNCi0JCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHdlYlBhcmFtLCBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RZUEVfTkFNRSwgdHlwZVNpZ24pOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBXZWJQYXJhbUtpbmQga2luZCA9IGlzV2ViUmVzdWx0KHdlYlBhcmFtKSA/IFdlYlBhcmFtS2luZC5PVVQgOiBjYWxjS2luZCh3cEFubm90YXRpb24sIG1ldGhvZCwgdHlwZVNpZ24pOw0KLQkJaWYgKCFraW5kLmVxdWFscyh3ZWJQYXJhbS5nZXRLaW5kKCkpKSB7DQotCQkJd2ViUGFyYW0uc2V0S2luZChraW5kKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgYm9vbGVhbiBpc0hlYWRlciA9IGNhbGNIZWFkZXIod3BBbm5vdGF0aW9uKTsNCi0JCWlmICh3ZWJQYXJhbS5pc0hlYWRlcigpIF4gaXNIZWFkZXIpIHsNCi0JCQl3ZWJQYXJhbS5zZXRIZWFkZXIoaXNIZWFkZXIpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGlzV2ViUmVzdWx0KHdlYlBhcmFtKSA/IGRlZkNhbGMoKS5jYWxjV2ViUmVzdWx0RGVmYXVsdE5hbWUod2ViTWV0aG9kKSA6IGNhbGNOYW1lKHdwQW5ub3RhdGlvbiwgd2ViTWV0aG9kLCBwb3MpOw0KLQkJaWYgKCFuYW1lLmVxdWFscyh3ZWJQYXJhbS5nZXROYW1lKCkpKSB7DQotCQkJd2ViUGFyYW0uc2V0TmFtZShuYW1lKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU3RyaW5nIHBhcnROYW1lID0gY2FsY1BhcnROYW1lKHdwQW5ub3RhdGlvbiwgbmFtZSk7DQotCQlpZiAoIXBhcnROYW1lLmVxdWFscyh3ZWJQYXJhbS5nZXRQYXJ0TmFtZSgpKSkgew0KLQkJCXdlYlBhcmFtLnNldFBhcnROYW1lKHBhcnROYW1lKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGNhbGNUYXJnZXROYW1lc3BhY2Uod3BBbm5vdGF0aW9uLCB3ZWJNZXRob2QsIHdlYlBhcmFtKTsNCi0JCWlmICghdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyh3ZWJQYXJhbS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsNCi0JCQl3ZWJQYXJhbS5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsNCi0JCX0JCQ0KLQkJDQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQod2ViUGFyYW0sIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7CQkNCi0JCWFkYXB0VG9Mb2NhdGlvbkludGVyZmFjZSh3ZWJQYXJhbSwgV1BfQU5OT1RBVElPTiwgd3BBbm5vdGF0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGlzV2ViUmVzdWx0KGZpbmFsIElXZWJQYXJhbSBwYXJhbSkNCi0Jew0KLQkJcmV0dXJuIHBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKFJFVFVSTl9QQVJBTV9OQU1FKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKGZpbmFsIElNZXRob2QgbWV0aG9kLCBmaW5hbCBTdHJpbmcgdHlwZVNpZ25hdHVyZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCXsNCi0JCWlmIChTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQodHlwZVNpZ25hdHVyZSkgPT0gU2lnbmF0dXJlLkJBU0VfVFlQRV9TSUdOQVRVUkUpDQotCQl7DQotCQkJcmV0dXJuIFNpZ25hdHVyZS50b1N0cmluZyh0eXBlU2lnbmF0dXJlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU3RyaW5nW11bXSByZXNvbHZlZFR5cGVzID0gbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKS5yZXNvbHZlVHlwZShTaWduYXR1cmUudG9TdHJpbmcodHlwZVNpZ25hdHVyZSkpOw0KLQkJaWYgKHJlc29sdmVkVHlwZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJZmluYWwgU3RyaW5nIHBhY2sgPSByZXNvbHZlZFR5cGVzWzBdWzBdOw0KLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IHJlc29sdmVkVHlwZXNbMF1bMV07DQotCQlpZiAocGFjayAhPSBudWxsICYmIHBhY2subGVuZ3RoKCkgIT0gMCkNCi0JCXsNCi0JCQlyZXR1cm4gcGFjayArICIuIiArIGNsYXNzTmFtZTsvLyROT04tTkxTLTEkDQotCQl9IGVsc2UNCi0JCXsNCi0JCQlyZXR1cm4gY2xhc3NOYW1lOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgV2ViUGFyYW1LaW5kIGNhbGNLaW5kKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBwYXJtQW5ub3RhdGlvbiwgZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHBhcm1Bbm5vdGF0aW9uICE9IG51bGwgJiYgcGFybUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShNT0RFX0FUVFJJQlVURSkgIT0gbnVsbCkNCi0JCXsNCi0JCQlmaW5hbCBTdHJpbmcgbW9kZSA9IHBhcm1Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoTU9ERV9BVFRSSUJVVEUpOw0KLQkJCWlmIChXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9JTk9VVC5lbmRzV2l0aChtb2RlKSkNCi0JCQl7DQotCQkJCXJldHVybiBXZWJQYXJhbUtpbmQuSU5PVVQ7DQotCQkJfQ0KLQkJCWlmIChXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9JTi5lbmRzV2l0aChtb2RlKSkNCi0JCQl7DQotCQkJCXJldHVybiBXZWJQYXJhbUtpbmQuSU47DQotCQkJfQ0KLQkJCWlmIChXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9PVVQuZW5kc1dpdGgobW9kZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gV2ViUGFyYW1LaW5kLk9VVDsNCi0JCQl9DQotCQl9IA0KLQkJDQotCQlpZiAoaXNQb3NzaWJseUhvbGRlckNsYXNzKHR5cGVTaWduYXR1cmUpKSB7DQotCQkJZmluYWwgU3RyaW5nIHR5cGVGUU5hbWUgPSByZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKG1ldGhvZCwgdHlwZVNpZ25hdHVyZSk7DQotCQkJaWYgKHR5cGVGUU5hbWUuc3RhcnRzV2l0aChIT0xERVJfQ0xBU1NfRlFOQU1FKSkgew0KLQkJCQlyZXR1cm4gV2ViUGFyYW1LaW5kLklOT1VUOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIFdlYlBhcmFtS2luZC5JTjsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEFkZGVkIGR1ZSB0byBwZXJmb3JtYW5jZSBpc3N1ZXMgQ1NOIDAxMjAwNjE1MzIgMDAwMjI1NjkyNSAyMDA5Lg0KLQkgKiBUaGUgaWRlYSBpcyB0aGF0IGJlZm9yZSBjYWxsaW5nIHtAbGluayAjcmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZShJTWV0aG9kLCBTdHJpbmcpfQ0KLQkgKiB3ZSBjaGVjayBpZiB0aGUgY2xhc3MgaXMgcG90ZW50aWFsbHkgSG9sZGVyLg0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzUG9zc2libHlIb2xkZXJDbGFzcyhmaW5hbCBTdHJpbmcgdHlwZVNpZ25hdHVyZSkgewkNCi0JCWZpbmFsIFN0cmluZyBlcmFzdXRlVHlwZU5hbWUgPSBTaWduYXR1cmUuZ2V0U2lnbmF0dXJlU2ltcGxlTmFtZShTaWduYXR1cmUuZ2V0VHlwZUVyYXN1cmUodHlwZVNpZ25hdHVyZSkpOw0KLQkJaWYgKEhPTERFUl9DTEFTU19OQU1FLmVxdWFscyhlcmFzdXRlVHlwZU5hbWUpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY05hbWUoSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHBhcm1Bbm5vdGF0aW9uLCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgaW50IHBhcmFtUG9zaXRpb24pDQotCXsNCi0JCWlmIChwYXJtQW5ub3RhdGlvbiAhPSBudWxsICYmIHBhcm1Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoTkFNRV9BVFRSSUJVVEUpICE9IG51bGwpIHsNCi0JCQlyZXR1cm4gcGFybUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShOQU1FX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuY2FsY1dlYlBhcmFtRGVmYXVsdE5hbWUod2ViTWV0aG9kLCBwYXJhbVBvc2l0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY1BhcnROYW1lKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiB3cEFubm90YXRpb24sIGZpbmFsIFN0cmluZyBuYW1lKSANCi0Jew0KLQkJaWYgKHdwQW5ub3RhdGlvbiE9bnVsbCAmJiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShQQVJUX05BTUVfQVRUUklCVVRFKSE9bnVsbCkgew0KLQkJCXJldHVybiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShQQVJUX05BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBjYWxjSGVhZGVyKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiB3cEFubm90YXRpb24pDQotCXsNCi0JCWlmICh3cEFubm90YXRpb24hPW51bGwgJiYgd3BBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoSEVBREVSX0FUVFJJQlVURSkhPW51bGwpIHsNCi0JCQlyZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4od3BBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoSEVBREVSX0FUVFJJQlVURSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIGNhbGNUYXJnZXROYW1lc3BhY2UoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHdwQW5ub3RhdGlvbiwgZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJaWYgKHdwQW5ub3RhdGlvbiE9bnVsbCAmJiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSkhPW51bGwpIHsNCi0JCQlyZXR1cm4gd3BBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QsIHdlYlBhcmFtKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJV2ViUGFyYW0gb2J0YWluSW5zdGFuY2UoSVdlYk1ldGhvZCB3bSwgU3RyaW5nIGltcGwpDQotCXsNCi0JCWZpbmFsIElXZWJQYXJhbSBleGlzdGluZyA9IGZpbmRXZWJQYXJhbUJ5SW1wbE5hbWUod20sIGltcGwpOw0KLQkJaWYgKGV4aXN0aW5nICE9IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGV4aXN0aW5nOw0KLQkJfQ0KLQkJZmluYWwgSVdlYlBhcmFtIG5ld1BhcmFtID0gZG9tRmFjdG9yeSgpLmNyZWF0ZUlXZWJQYXJhbSgpOw0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShuZXdQYXJhbSwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19JTVBMRU1FTlRBVElPTiwgaW1wbCk7DQotCQl3bS5nZXRQYXJhbWV0ZXJzKCkuYWRkKG5ld1BhcmFtKTsNCi0JCXJldHVybiBuZXdQYXJhbTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJV2ViUGFyYW0gZmluZFdlYlBhcmFtQnlJbXBsTmFtZShmaW5hbCBJV2ViTWV0aG9kIHdtLCBmaW5hbCBTdHJpbmcgaW1wbCkNCi0Jew0KLQkJZm9yIChJV2ViUGFyYW0gcGFyYW0gOiB3bS5nZXRQYXJhbWV0ZXJzKCkpDQotCQl7DQotCQkJaWYgKGltcGwuZXF1YWxzKHBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHBhcmFtOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXJnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTBjZTgyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5TQkFubm90YXRpb25GZWF0dXJlcy5TQl9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotLyoqDQotICogU3luY2hyb25pemVyIHRoYXQgbWVyZ2VzIGNvbnRlbnQgb2Yge0BsaW5rIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9IHdpdGggdGhlIGN1cnJlbnQgY29udGVudCBvZiANCi0gKiB0aGUgY2xhc3MgaW1wbGVtZW50aW5nIGl0LiAgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlNZXJnZXIgZXh0ZW5kcyBFbGVtZW50U3luY2hyb25pemVySW1wbA0KLXsNCi0JcHJpdmF0ZSBBYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplciBtZXRob2RTeW5jaHJvbml6ZXI7DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIHBhcmVudA0KLQkgKiBAcGFyYW0gbWV0aG9kU3luYyB0aGUgc3luY2hyb25pemVyIHRoYXQgdGFrZXMgY2FyZSBmb3IgdGhlIFNFSSBtZXRob2RzDQotCSAqLw0KLQlwdWJsaWMgU2VpTWVyZ2VyKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50LCBBYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplciBtZXRob2RTeW5jKSANCi0Jew0KLQkJc3VwZXIocGFyZW50KTsNCi0JCW51bGxDaGVja1BhcmFtKG1ldGhvZFN5bmMpOw0KLQkJdGhpcy5tZXRob2RTeW5jaHJvbml6ZXIgPSBtZXRob2RTeW5jOw0KLQl9DQotCQkNCi0JcHJvdGVjdGVkIHZvaWQgbWVyZ2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgc2VpTmFtZSA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKSA9PSBudWxsID8gDQotCQkJCUpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgOiB3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShOQU1FX0FUVFJJQlVURSk7DQotCQkJCQ0KLQkJaWYgKCFzZWlOYW1lLmVxdWFscyhzZWkuZ2V0TmFtZSgpKSkgew0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUoc2VpLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRSwgc2VpTmFtZSk7DQotCQl9DQotCQkJCQ0KLQkJLy8gYWRkIHRhcmdldE5hbWVzcGFjZQ0KLQkJZmluYWwgU3RyaW5nIHRhcmdldE5zID0gZXh0cmFjdFRhcmdldE5hbWVzcGFjZSh3c0Fubm90YXRpb24pOw0KLQkJaWYgKCF0YXJnZXROcy5lcXVhbHMoc2VpLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgew0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUoc2VpLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSwgdGFyZ2V0TnMpOw0KLQkJfQ0KLQkJDQotCQltZXJnZVNvYXBCaW5kaW5nKHNlaSwgaW5zcGVjdG9yKTsNCi0JCW1ldGhvZFN5bmNocm9uaXplci5zeW5jaHJvbml6ZU1ldGhvZHMoc2VpLCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSwgaW5zcGVjdG9yKTsNCi0JCQ0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHNlaSwgV1NfQU5OT1RBVElPTiwgd3NBbm5vdGF0aW9uKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFRhcmdldE5hbWVzcGFjZShmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uKQ0KLQl7DQotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlDQotCQlmaW5hbCBTdHJpbmcgdGFyZ2V0TnMgPSB3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSk7DQotCQlpZiAodGFyZ2V0TnM9PW51bGwpIHsNCi0JCQlyZXR1cm4gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2Uod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQl9CQ0KLQkJDQotCQlyZXR1cm4gdGFyZ2V0TnM7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBtZXJnZVNvYXBCaW5kaW5nKGZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IHNiQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShTQl9BTk5PVEFUSU9OKTsNCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdTdHlsZSBzdHlsZSA9IGRlZkNhbGMoKS5kZWZpbmVTQlN0eWxlKHNiQW5ub3RhdGlvbik7DQotCQlpZiAoc2VpLmdldFNvYXBCaW5kaW5nU3R5bGUoKSAhPSBzdHlsZSkgew0KLQkJCXNlaS5zZXRTb2FwQmluZGluZ1N0eWxlKHN0eWxlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdVc2UgdXNlID0gZGVmQ2FsYygpLmRlZmluZVNCVXNlKHNiQW5ub3RhdGlvbik7DQotCQlpZiAoc2VpLmdldFNvYXBCaW5kaW5nVXNlKCkgIT0gdXNlKSB7DQotCQkJc2VpLnNldFNvYXBCaW5kaW5nVXNlKHVzZSk7DQotCQl9DQotCQkNCi0JCWZpbmFsIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgcGFyYW1TdHlsZSA9IGRlZkNhbGMoKS5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKHNiQW5ub3RhdGlvbik7DQotCQlpZiAoc2VpLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSAhPSBwYXJhbVN0eWxlKSB7DQotCQkJc2VpLnNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUocGFyYW1TdHlsZSk7DQotCQl9DQotCQkNCi0JCWFkYXB0VG9Mb2NhdGlvbkludGVyZmFjZShzZWksIFNCX0FOTk9UQVRJT04sIHNiQW5ub3RhdGlvbik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1ldGhvZFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1ldGhvZFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzU0ZjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXRob2RTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLQ0KLWNsYXNzIFNlaU1ldGhvZFN5bmNocm9uaXplciBleHRlbmRzIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyDQotew0KLQ0KLQlwdWJsaWMgU2VpTWV0aG9kU3luY2hyb25pemVyKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50KQ0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4cG9zYWJsZU1ldGhvZHMoSU1ldGhvZFZpc2l0b3IgdmlzaXRvciwgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5LCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdmlzaXRSZWN1cnNpdmVseSh2aXNpdG9yLCBoaWVyYXJjaHkuZ2V0VHlwZSgpLCBoaWVyYXJjaHksIGluc3BlY3Rvcik7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHZpc2l0UmVjdXJzaXZlbHkoSU1ldGhvZFZpc2l0b3IgdmlzaXRvciwgSVR5cGUgdHlwZSwgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5LCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IHR5cGUuZ2V0TWV0aG9kcygpKQ0KLQkJew0KLQkJCXZpc2l0b3IudmlzaXQobWV0aG9kLCBpbnNwZWN0b3IpOw0KLQkJfQ0KLQ0KLQkJZm9yIChJVHlwZSBzdXBlckludGYgOiBoaWVyYXJjaHkuZ2V0U3VwZXJJbnRlcmZhY2VzKHR5cGUpKQ0KLQkJewkJCQ0KLQkJCXZpc2l0UmVjdXJzaXZlbHkodmlzaXRvciwgc3VwZXJJbnRmLCBoaWVyYXJjaHksIHJlc291cmNlKCkubmV3QW5ub3RhdGlvbkluc3BlY3RvcihzdXBlckludGYpKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4ZWZhNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaVN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotLyoqDQotICogU3luY2hyb25pemVyIGZvciBleHBsaWNpdCB7QGxpbmsgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZX0gaW5zdGFuY2UuIFVwZGF0ZXMgdGhlIERPTSBpbnN0YW5jZSB0byB0aGUgY3VycmVudA0KLSAqIFNFSSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBieSByZWFkaW5nIHJlbGV2YW50IGFubm90YXRpb25zIGFuZCANCi0gKiANCi0gKiBAYXV0aG9yIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlTeW5jaHJvbml6ZXIgZXh0ZW5kcyBFbGVtZW50U3luY2hyb25pemVySW1wbA0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBTZWlNZXJnZXIgc2VpTWVyZ2VyOyANCi0NCi0JU2VpU3luY2hyb25pemVyKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50KQ0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQkJc2VpTWVyZ2VyID0gbmV3IFNlaU1lcmdlcih0aGlzLCBuZXcgU2VpTWV0aG9kU3luY2hyb25pemVyKHRoaXMpKTsNCi0JfQ0KLQ0KLQkvKiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlICovDQotCXZvaWQgc3luY2hyb25pemVJbnRlcmZhY2UoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgSUFubm90YXRpb248SVR5cGU+IHdzQW5ub3RhdGlvbiwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gb2J0YWluSW5zdGFuY2Uod3NQcm9qZWN0LCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlzZWlNZXJnZXIubWVyZ2Uoc2VpLCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7DQotCQlyZXNvbHZlV3NSZWZzVG9UaGlzU2VpKHNlaSk7DQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQoc2VpLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOwkJDQotCX0NCi0NCi0JcHJpdmF0ZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9idGFpbkluc3RhbmNlKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIFN0cmluZyBpbXBsTmFtZSkNCi0Jew0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBudWxsOw0KLQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGV4aXN0aW5nIDogd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCXsNCi0JCQlpZiAoZXhpc3RpbmcuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbE5hbWUpKSB7DQotCQkJCXNlaSA9IGV4aXN0aW5nOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJaWYgKHNlaT09bnVsbCkNCi0JCXsNCi0JCQlzZWkgPSBkb21GYWN0b3J5KCkuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUoc2VpLCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCBpbXBsTmFtZSk7DQotCQkJd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5hZGQoc2VpKTsNCi0JCX0NCi0JCQ0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwgZmFsc2UpOw0KLQkJDQotCQlyZXR1cm4gc2VpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZXNvbHZlV3NSZWZzVG9UaGlzU2VpKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKQ0KLQl7DQotCQlmb3IgKElXZWJTZXJ2aWNlIHdzIDogc2VydmljZURhdGEoKS5nZXRJbXBsZW1lbnRpbmdXcyhzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSkpDQotCQl7DQotCQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IHNlaSkNCi0JCQl7DQotCQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUod3MsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5ULCBzZWkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvV1NNZXRob2RTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9XU01ldGhvZFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDkzNGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9XU01ldGhvZFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlcy5XTV9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBXU01ldGhvZFN5bmNocm9uaXplciBleHRlbmRzIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyDQotew0KLQ0KLQlwdWJsaWMgV1NNZXRob2RTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHZpc2l0RXhwb3NhYmxlTWV0aG9kcyhJTWV0aG9kVmlzaXRvciB2aXNpdG9yLCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl2aXNpdFJlY3Vyc2l2ZWx5KHZpc2l0b3IsIGhpZXJhcmNoeS5nZXRUeXBlKCksIGhpZXJhcmNoeSwgaW5zcGVjdG9yKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdmlzaXRSZWN1cnNpdmVseShJTWV0aG9kVmlzaXRvciB2aXNpdG9yLCBJVHlwZSB0eXBlLCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAodHlwZSA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybjsNCi0JCX0NCi0JDQotCQlhc3NlcnQgdHlwZS5pc0NsYXNzKCk7DQotCQlmaW5hbCBib29sZWFuIGlzV2ViU2VydmljZSA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKSAhPSBudWxsOw0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IHR5cGUuZ2V0TWV0aG9kcygpKQ0KLQkJew0KLQkJCWlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpDQotCQkJew0KLQkJCQkvLyBDb25zdHJ1Y3RvcnMgY2FuIG5ldmVyIHRha2UgcGFydCBpbiB0aGUgcG9ydHR5cGUNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCWZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IHdtQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgV01fQU5OT1RBVElPTik7DQotCQkJZmluYWwgYm9vbGVhbiBpc0V4Y2x1ZGVkV2l0aEFubm90YXRpb24gPSB3bUFubm90YXRpb24gPT0gbnVsbCA/IGZhbHNlIDogInRydWUiLmVxdWFscyh3bUFubm90YXRpb24vLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQkuZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9FWENMVURFRF9BVFRSSUJVVEUpKTsNCi0JCQlpZiAoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kLmdldEZsYWdzKCkpICYmICFpc0V4Y2x1ZGVkV2l0aEFubm90YXRpb24gJiYgKGlzV2ViU2VydmljZSB8fCB3bUFubm90YXRpb24gIT0gbnVsbCkpDQotCQkJew0KLQkJCQl2aXNpdG9yLnZpc2l0KG1ldGhvZCwgaW5zcGVjdG9yKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWZpbmFsIElUeXBlIHN1cGVyVHlwZSA9IGhpZXJhcmNoeS5nZXRTdXBlcmNsYXNzKHR5cGUpOw0KLQkJaWYgKHN1cGVyVHlwZSE9bnVsbCkgew0KLQkJCXZpc2l0UmVjdXJzaXZlbHkodmlzaXRvciwgc3VwZXJUeXBlLCBoaWVyYXJjaHksIHJlc291cmNlKCkubmV3QW5ub3RhdGlvbkluc3BlY3RvcihzdXBlclR5cGUpKTsNCi0JCX0NCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvV3NTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZDcyNjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5QT1JUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NETF9MT0NBVElPTl9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotcHVibGljIGNsYXNzIFdzU3luY2hyb25pemVyIGV4dGVuZHMgRWxlbWVudFN5bmNocm9uaXplckltcGwNCi17DQotCXByaXZhdGUgZmluYWwgU2VpTWVyZ2VyIHNlaU1lcmdlcjsNCi0NCi0JcHVibGljIFdzU3luY2hyb25pemVyKElNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXIgcGFyZW50KQ0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQkJdGhpcy5zZWlNZXJnZXIgPSBuZXcgU2VpTWVyZ2VyKHRoaXMsIG5ldyBXU01ldGhvZFN5bmNocm9uaXplcih0aGlzKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJV2ViU2VydmljZSBvYnRhaW5JbnN0YW5jZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBTdHJpbmcgaW1wbE5hbWUpDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkNCi0JCXsNCi0JCQlpZiAod3MuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbE5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdzOw0KLQkJCX0NCi0JCX0NCi0JCWZpbmFsIElXZWJTZXJ2aWNlIG5ld1dzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUobmV3V3MsIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIGltcGxOYW1lKTsNCi0JCXV0aWwoKS5hZGRUb0NvbGxlY3Rpb25GZWF0dXJlKHdzUHJvamVjdCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTLCBuZXdXcyk7DQotCQkNCi0JCXJldHVybiBuZXdXczsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVdlYlNlcnZpY2Ugc3luY2hyb25pemVXZWJTZXJ2aWNlKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IG9idGFpbkluc3RhbmNlKHdzUHJvamVjdCwgd3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJbWVyZ2VXZWJTZXJ2aWNlKHdzLCB3c1Byb2plY3QsIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsNCi0JCQ0KLQkJcmVzb3VyY2UoKS5nZXRTZXJpYWxpemVyRmFjdG9yeSgpLmFkYXB0KHdzLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHdzLCBXU19BTk5PVEFUSU9OLCB3c0Fubm90YXRpb24pOw0KLQkJDQotCQlyZXR1cm4gd3M7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1lcmdlV2ViU2VydmljZShJV2ViU2VydmljZSB0b01lcmdlLCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJLy8gYWRkIHNlcnZpY2VOYW1lIG5hbWUNCi0JCWZpbmFsIFN0cmluZyB3c05hbWUgPSB3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTRVJWSUNFX05BTUVfQVRUUklCVVRFKSA9PSBudWxsID8NCi0JCQkJSmF4V3NVdGlscy5nZXREZWZhdWx0U2VydmljZU5hbWUod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpIDogDQotCQkJCXdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUpOw0KLQkJCQkNCi0JCWlmICghd3NOYW1lLmVxdWFscyh0b01lcmdlLmdldE5hbWUoKSkpDQotCQl7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh0b01lcmdlLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fTkFNRSwgd3NOYW1lKTsNCi0JCX0NCi0JCQ0KLQkJLy8gYWRkIHRhcmdldE5hbWVzcGFjZQ0KLQkJZmluYWwgU3RyaW5nIHRhcmdldE5zID0gZXh0cmFjdFRhcmdldE5hbWVzcGFjZSh3c0Fubm90YXRpb24pOw0KLQkJaWYgKCF0YXJnZXROcy5lcXVhbHModG9NZXJnZS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsNCi0JCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHRvTWVyZ2UsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFLCB0YXJnZXROcyk7DQotCQl9DQotCQkNCi0JCS8vIGFkZCBwb3J0TmFtZQ0KLQkJZmluYWwgU3RyaW5nIHBvcnROYW1lID0gd3NBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoUE9SVF9OQU1FX0FUVFJJQlVURSk9PW51bGwgPw0KLQkJCQlKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgOg0KLQkJCQl3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShQT1JUX05BTUVfQVRUUklCVVRFKTsNCi0JCQkJDQotCQlpZiAoIXBvcnROYW1lLmVxdWFscyh0b01lcmdlLmdldFBvcnROYW1lKCkpKSB7DQotCQkJdG9NZXJnZS5zZXRQb3J0TmFtZShwb3J0TmFtZSk7DQotCQl9DQotCQkNCi0JCS8vIGFkZCB3c2RsTG9jYXRpb24NCi0JCXRvTWVyZ2Uuc2V0V3NkbExvY2F0aW9uKHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdTRExfTE9DQVRJT05fQVRUUklCVVRFKSk7DQotCQkNCi0JCS8vIGFkZCBlbmRwb2ludEludGVyZmFjZQ0KLQkJZmluYWwgU3RyaW5nIG5ld1NlaUltcGwgPSB3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShFTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFKTsNCi0JCWlmIChuZXdTZWlJbXBsID09IG51bGwpDQotCQl7DQotCQkJbWVyZ2VJbXBsaWNpdEludGVyZmFjZShvYnRhaW5JbXBsaWNpdEludGVyZmFjZUluc3RhbmNlKHdzUHJvamVjdCwgdG9NZXJnZSwgd3NBbm5vdGF0aW9uKSwgd3NBbm5vdGF0aW9uLCBpbnNwZWN0b3IpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJaWYgKHRvTWVyZ2UuZ2V0U2VydmljZUVuZHBvaW50KCkgPT0gbnVsbCB8fCAhdG9NZXJnZS5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhuZXdTZWlJbXBsKSkNCi0JCQl7DQotCQkJCXNlcnZpY2VEYXRhKCkubWFwKHRvTWVyZ2UsIG5ld1NlaUltcGwpOw0KLQkJCQlyZXNvbHZlSW50ZXJmYWNlKHRvTWVyZ2UsIHdzUHJvamVjdCwgd3NBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURSkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugb2J0YWluSW1wbGljaXRJbnRlcmZhY2VJbnN0YW5jZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBJV2ViU2VydmljZSB3cywgSUFubm90YXRpb248SVR5cGU+IHdzQW5ub3RhdGlvbikNCi0Jew0KLQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IG51bGwgJiYgd3MuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKQ0KLQkJew0KLQkJCXJldHVybiB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCX0NCi0NCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwgdHJ1ZSk7DQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHNlaSwgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgd3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3cywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIHNlaSk7DQotCQkNCi0JCXdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkKHNlaSk7DQotCQkNCi0JCXJldHVybiBzZWk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1lcmdlSW1wbGljaXRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlzZWlNZXJnZXIubWVyZ2Uoc2VpLCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7DQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQoc2VpLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24pDQotCXsNCi0JCS8vIGFkZCB0YXJnZXROYW1lc3BhY2UNCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKTsNCi0JCWlmICh0YXJnZXROcz09bnVsbCkgew0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiB0YXJnZXROczsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVzb2x2ZUludGVyZmFjZShJV2ViU2VydmljZSB3cywgSVdlYlNlcnZpY2VQcm9qZWN0IHByZWZmZXJlZCwgU3RyaW5nIGltcGxlbWVudGF0aW9uKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHJlc29sdmVkID0gbnVsbDsNCi0JCWZvciAoSVdlYlNlcnZpY2VQcm9qZWN0IHByaiA6IGdldERvbUJlaW5nTG9hZGVkKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkpDQotCQl7DQotCQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHByai5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpDQotCQkJew0KLQkJCQlpZiAoc2VpLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxlbWVudGF0aW9uKSkNCi0JCQkJew0KLQkJCQkJcmVzb2x2ZWQgPSBzZWk7DQotCQkJCQlpZiAocHJlZmZlcmVkLmVxdWFscyhwcmopKQ0KLQkJCQkJew0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfSBlbHNlDQotCQkJCQl7DQotCQkJCQkJcmVzb2x2ZWQgPSBzZWk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHdzLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCwgcmVzb2x2ZWQpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcHJvdmlkZXIvSUVuZHBvaW50TWV0YWRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcHJvdmlkZXIvSUVuZHBvaW50TWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzg2NGMyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcjsNCi0NCi0vKioNCi0gKiBSZXByZXNlbnRzIG1ldGFkYXRhIGZvciBhbiBlbmRwb2ludC4gQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5hbWUgYW5kIG5hbWVzcGFjZSBvZiB0aGUgZW5kcG9pbnQuIENvbnRhaW5zIGV4cG9zZWQgb3BlcmF0aW9ucy4gVGhpcyBpbnRlcmZhY2UNCi0gKiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGlucHV0IGRhdGEgZm9yIGltcGxlbWVudG9ycyBvZiB7QGxpbmsgSUVuZHBvaW50R2VuZXJhdG9yfS4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElFbmRwb2ludE1ldGFkYXRhDQotew0KLQkvKioNCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiBlbnBvaW50Lg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIFRoZSBwYWNrYWdlL25hbWVzcGFjZSBvZiB0aGUgZW5kcG9pbnQuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2UoKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgcmVwcmVzZW50aW5nIHRoaXMgZW5kcG9pbnQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHdzZGw6c2VydmljZSByZXByZXNlbnRpbmcgdGhpcyBlbmRwb2ludC4NCi0JICogDQotCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHdzZGw6cG9ydCByZWZlcmVuY2luZyB0aGlzIGVuZHBvaW50IHdoaWNoIHRoaXMNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHdzZGw6cG9ydCByZWZlcmVuY2luZyB0aGlzIGVuZHBvaW50IHdoaWNoIHRoaXMNCi0JICogDQotCSAqIEBwYXJhbSBwb3J0TmFtZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHdzZGwgbG9jYXRpb24gaW4gY2FzZSB0aGlzIGVuZHBvaW50IGlzIGdlbmVyYXRlZCBmcm9tIHdzZGwgb3RoZXJ3aXNlIDx0dD5udWxsPC90dD4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbExvY2F0aW9uKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB3c2RsIGxvY2F0aW9uIGluIGNhc2UgdGhpcyBlbmRwb2ludCBpcyBnZW5lcmF0ZWQgZnJvbSB3c2RsDQotCSAqIA0KLQkgKiBAcGFyYW0gd3NkbExvY2F0aW9uDQotCSAqICAgICAgICAgICAgbG9jYXRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgd3NkbExvY2F0aW9uKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIG5hbWVzcGFjZSBVUkkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7DQotDQotCS8qKg0KLQkgKiBzZXRzIHRoZSBuYW1lc3BhY2UgVVJJDQotCSAqIA0KLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBjb250YWluaW5nIFdlYlNlcnZpY2UgbWV0aG9kcyB0aGF0IHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgdGhpcyBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbi4gVGhpcw0KLQkgKiAgICAgICAgIG1ldGhvZCBjYW4gcmV0dXJuIDx0dD5udWxsPC90dD4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0U0VJTmFtZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgcmVmZXJlbmNlZCBieSB0aGlzIGVuZHBvaW50Lg0KLQkgKiANCi0JICogQHBhcmFtIHNlaU5hbWUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIDx0dD5zZWlOYW1lPC90dD4gaXMgbnVsbA0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIDx0dD5zZWlOYW1lPC90dD4gaXMgZW1wdHkgc3RyaW5nDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTRUlOYW1lKFN0cmluZyBzZWlOYW1lKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGVuZHBvaW50Lg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gbGlzdCBvZiBhZGRlZCBtZXRob2RzDQotCSAqLw0KLQlwdWJsaWMgTGlzdDxJRW5kcG9pbnRNZXRob2Q+IGdldE1ldGhvZHMoKTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIElFbmRwb2ludE1ldGhvZH0gd2l0aCA8dHQ+bmFtZTwvdHQ+IGFuZCA8dHQ+cmV0dXJuVHlwZUZRTmFtZTwvdHQ+IGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgYXZhaWxhYmxlDQotCSAqIG1ldGhvZHMuDQotCSAqIA0KLQkgKiBAcGFyYW0gbmFtZQ0KLQkgKiBAcGFyYW0gcmV0dXJuVHlwZUZRTmFtZQ0KLQkgKiBAcmV0dXJuIGNyZWF0ZWQgSUVuZHBvaW50TWV0aG9kIGZvciBhZGRlZCBtZXRob2QNCi0JICovDQotCXB1YmxpYyBJRW5kcG9pbnRNZXRob2QgYWRkTWV0aG9kKFN0cmluZyBuYW1lLCBTdHJpbmcgcmV0dXJuVHlwZUZRTmFtZSk7DQotCQ0KLQkvKioNCi0JICogQWRkcyB7QGxpbmsgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcn0gdG8gdGhlIHtAbGluayBJRW5kcG9pbnRNZXRhZGF0YX0gZGVzY3JpcHRvci4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uc0NvbnRhaW5lciAtIENvbnRhaW5lciwgd2hpY2ggd2lsbCBiZSBhZGRlZC4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uc0NvbnRhaW5lcihmaW5hbCBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGFubm90YXRpb25zQ29udGFpbmVyKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgU2V0IHdpdGgge0BsaW5rIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJ9IHJlbGF0ZWQgdG8gdGhlIHtAbGluayBJRW5kcG9pbnRNZXRhZGF0YX0gZGVzY3JpcHRvci4NCi0JICoNCi0JICogQHJldHVybiBTZXQgd2l0aCB7QGxpbmsgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcn0uDQotCSAqLw0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXI+IGdldEFubm90YXRpb25zQ29udGFpbmVyKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcHJvdmlkZXIvSUVuZHBvaW50TWV0aG9kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDIxY2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcHJvdmlkZXIvSUVuZHBvaW50TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyOw0KLQ0KLS8qKg0KLSAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgbWV0aG9kIGluIGVuZHBvaW50Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElFbmRwb2ludE1ldGhvZA0KLXsNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBuYW1lDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHJldHVybkZRTmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlKCk7DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gcmV0dXJuVHlwZUZRTmFtZQ0KLQkgKiAgICAgICAgICAgIHNldHMgdGhlIHJldHVybiB0eXBlDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRSZXR1cm5UeXBlKFN0cmluZyByZXR1cm5UeXBlRlFOYW1lKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gaHVtYW4gcmVhZGFibGUgbWV0aG9kIHJlcHJlc2VudGF0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiBzZXQgb2YgdGhyb3duIGV4Y2VwdGlvbnMNCi0JICovDQotCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRFeGNlcHRpb25zKCk7DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gZXhjZXB0aW9uRlFOYW1lDQotCSAqICAgICAgICAgICAgYWRkIHRocm93biBleGNlcHRpb24gdG8gdGhlIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkRXhjZXB0aW9uKFN0cmluZyBleGNlcHRpb25GUU5hbWUpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiBsaXN0IG9mIG1ldGhvZCBwYXJhbXMgb24gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIExpc3Q8SU1ldGhvZFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpOw0KLQ0KLQkvKioNCi0JICogY3JlYXRlcyBuZXcgcGFyYW0gYW5zIGFkZHMgaXQgdG8gdGhlIGVuZCBvZiBwYXJhbWV0ZXJzIGxpc3QuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lDQotCSAqIEBwYXJhbSBuYW1lIHBhcmFtZXRlciBuYW1lDQotCSAqIEByZXR1cm4ge0BsaW5rIElNZXRob2RQYXJhbWV0ZXJ9IGNyZWF0ZXMNCi0JICovDQotCXB1YmxpYyBJTWV0aG9kUGFyYW1ldGVyIGFkZFBhcmFtZXRlcihTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUpOw0KLQ0KLQkvKioNCi0JICogQWRkcyB7QGxpbmsgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcn0gdG8gdGhlIHtAbGluayBJRW5kcG9pbnRNZXRob2R9IGRlc2NyaXB0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnNDb250YWluZXIgLSBDb250YWluZXIsIHdoaWNoIHdpbGwgYmUgYWRkZWQuDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbnNDb250YWluZXIoZmluYWwgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBhbm5vdGF0aW9uc0NvbnRhaW5lcik7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIFNldCB3aXRoIHtAbGluayBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyfSByZWxhdGVkIHRvIHRoZSB7QGxpbmsgSUVuZHBvaW50TWV0aG9kfSBkZXNjcmlwdG9yLg0KLQkgKg0KLQkgKiBAcmV0dXJuIFNldCB3aXRoIHtAbGluayBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyfS4NCi0JICovDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcj4gZ2V0QW5ub3RhdGlvbnNDb250YWluZXIoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wcm92aWRlci9JTWV0aG9kUGFyYW1ldGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lNZXRob2RQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGU3M2U0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lNZXRob2RQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnByb3ZpZGVyOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgcGFyYW1ldGVyIGluIG1ldGhvZA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKiANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RQYXJhbWV0ZXINCi17DQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHBhcmFtZXRlciBmdWxseSBxdWFsaWZpZWQgbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcmVnaXN0cnkvSVdzRE9NUnVudGltZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcmVnaXN0cnkvSVdzRE9NUnVudGltZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWY4Y2IwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L0lXc0RPTVJ1bnRpbWVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklOYW1lZEV4dGVuc2lvbkluZm87DQotDQotLyoqDQotICogRGVmaW5lcyB0aGUgaW5mb3JtYXRpb24gc3RydWN0dXJlIHdoaWNoIHNob3VsZCBiZSBpbnN0YW50aWF0ZWQgdXBvbiByZWFkaW5nIGNvbnRyaWJ1dG9ycw0KLSAqIHRvIHRoZSBTdXBwb3J0ZWQgUnVudGltZSBleHRlbnNpb24gcG9pbnQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgSHJpc3RvdiBJMDM2MjAxDQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXc0RPTVJ1bnRpbWVJbmZvIGV4dGVuZHMgSU5hbWVkRXh0ZW5zaW9uSW5mbw0KLXsNCi0JLyoqDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBtYXAgb2YgcHJvamVjdCBmYWNldHMgcmVsZXZhbnQgZm9yIGEgcGFydGljdWxhciBydW50aW1lIHdoZXJlIHRoZSBrZXkgaXMgDQotCSAqIHRoZSBwcm9qZWN0IGZhY2V0IGlkIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgZmFjZXQgaWYgc3BlY2lmaWVkLg0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvamVjdEZhY2V0cygpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L1dzRE9NUnVudGltZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L1dzRE9NUnVudGltZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyYTgyZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC51dGlsLk5hbWVkRXh0ZW5zaW9uSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIEhyaXN0b3YgSTAzNjIwMQ0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFdzRE9NUnVudGltZVJlZ2lzdHJ5IA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUnVudGltZUluZm8gZXh0ZW5kcyBOYW1lZEV4dGVuc2lvbkluZm8gaW1wbGVtZW50cyBJV3NET01SdW50aW1lSW5mbw0KLQl7DQotCQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvamVjdEZhY2V0czsNCi0JCQ0KLQkJUnVudGltZUluZm8oZmluYWwgU3RyaW5nIHBJZCwgZmluYWwgU3RyaW5nIHBMYWJlbCwgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9qZWN0RmFjZXRzKQ0KLQkJew0KLQkJCXN1cGVyKHBJZCwgcExhYmVsKTsNCi0JCQkNCi0JCQl0aGlzLnByb2plY3RGYWNldHMgPSBwcm9qZWN0RmFjZXRzOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgTWFwPFN0cmluZyxTdHJpbmc+IGdldFByb2plY3RGYWNldHMoKQ0KLQkJew0KLQkJCXJldHVybiB0aGlzLnByb2plY3RGYWNldHM7DQotCQl9DQotIAl9DQotCQ0KLQkvKiogVGhlIElEIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgZm9yIGEgc3VwcG9ydGVkIHJ1bnRpbWUgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfWFAgPSBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4uUExVR0lOX0lEICsgIi5kb21ydW50aW1lcyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqCSBFcnJvciBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIGV4dGVuc2lvbiBwb2ludCBub3QgcHJvcGVybHkgZGVmaW5lZCAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQgPSAiUmVnaXN0ZXJlZCBydW50aW1lIGV4dGVuc2lvbiBub3QgcHJvcGVybHkgcmVnaXN0ZXJlZCAoZXJyb3IgaW4gcGx1Z2luLnhtbCkiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UID0gImltcGxlbWVudGF0aW9uIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfUFJPSkVDVF9GQUNFVF9FTEVNRU5UID0gInByb2plY3RfZmFjZXQiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfUFJPSkVDVF9GQUNFVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYUF9QUk9KRUNUX0ZBQ0VUX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UX0NMQVNTX0FUVFIgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBleGVjdXRhYmxlIGV4dGVuc2lvbi4NCi0JICogDQotCSAqIEBwYXJhbSBpbmZvIHRoZSBkZXNjcmlwdG9yIG9iamVjdCBidWlsdCBkdXJpbmcgZXh0ZW5zaW9uIHBvaW50IGxvYWQNCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiBydW50aW1lIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGluc3RhbnRpYXRlUnVudGltZShmaW5hbCBJV3NET01SdW50aW1lSW5mbyBpbmZvKQ0KLQl7DQotCQlmaW5hbCBJRXh0ZW5zaW9uIGV4dCA9IGZpbmRFeHRlbnNpb24oaW5mbyk7DQotCQkNCi0JCWlmKGV4dD09bnVsbCkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJCQ0KLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwgOiBleHQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpDQotCQl7DQotCQkJaWYgKGVsLmdldE5hbWUoKS5lcXVhbHMoWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVCkpDQotCQkJew0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJLy9GSVhNRSBDbGFzc0Nhc3RFeGNlcHRpb24gc2hvd2luZyB1cCBpbiB0aGUgbG9ncyBpbiB0aGUgV1RQIGJ1aWxkDQotCQkJCQlPYmplY3QgaW1wbCA9IGVsLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSKTsNCi0JCQkJCWlmIChpbXBsIGluc3RhbmNlb2YgSVdzRE9NUnVudGltZUV4dGVuc2lvbikgew0KLQkJCQkJCXJldHVybiAoSVdzRE9NUnVudGltZUV4dGVuc2lvbikgaW1wbDsNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCQl9DQotLy8JCQkJCXJldHVybiAoSVdzRE9NUnVudGltZUV4dGVuc2lvbikgZWwuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UX0NMQVNTX0FUVFIpOw0KLQkJCQl9IA0KLQkJCQljYXRjaCAoZmluYWwgQ29yZUV4Y2VwdGlvbiBlKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBleHRlbnNpb24iLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCQkNCi0JCQkJfQ0KLS8vCQkJCWNhdGNoIChmaW5hbCBDbGFzc0Nhc3RFeGNlcHRpb24gZSkNCi0vLwkJCQl7DQotLy8JCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJJbXBsZW1lbnRhdGlvbiBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgcHJvcGVyIGludGVyZmFjZSIsIGUpOyAvLyROT04tTkxTLTEkDQotLy8JCQkJCXJldHVybiBudWxsOw0KLS8vCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCWxvZ2dlcigpLmxvZ0Vycm9yKEVYVEVOU0lPTl9OT1RfUFJPUEVSTFlfUkVHSVNURVJFRCk7DQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogTG9jYXRlcyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNvbnRyaWJ1dGlvbiBkZWZpbml0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgcnVudGltZS4NCi0JICogDQotCSAqIEBwYXJhbSBpbmZvIHRoZSBkZXNjcmlwdG9yIG9iamVjdCBidWlsdCBkdXJpbmcgZXh0ZW5zaW9uIHBvaW50IGxvYWQNCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiBjb250cmlidXRpb24gZGVmaW5pdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJRXh0ZW5zaW9uIGZpbmRFeHRlbnNpb24oZmluYWwgSVdzRE9NUnVudGltZUluZm8gaW5mbykNCi0Jew0KLQkJaWYoaW5mbyE9bnVsbCkNCi0JCXsNCi0JCQlmaW5hbCBJRXh0ZW5zaW9uW10gZXh0cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoUlVOVElNRV9YUCkuZ2V0RXh0ZW5zaW9ucygpOw0KLQkJDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRzLmxlbmd0aDsgaSsrKQ0KLQkJCXsNCi0JCQkJaWYgKGV4dHNbaV0uZ2V0U2ltcGxlSWRlbnRpZmllcigpLmVxdWFscyhpbmZvLmdldElkKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZXh0c1tpXTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIHJ1bnRpbWVzLg0KLQkgKiANCi0JICogQHJldHVybiBzZXQgb2YgaW5mb3JtYXRpb24gcmVjb3JkcyBmb3IgdGhlIHJlZ2lzdGVyZWQgcnVudGltZXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpDQotCXsNCi0JCWZpbmFsIElFeHRlbnNpb25bXSBleHRzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChSVU5USU1FX1hQKS5nZXRFeHRlbnNpb25zKCk7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVJbmZvPiBydW50aW1lRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PElXc0RPTVJ1bnRpbWVJbmZvPihleHRzLmxlbmd0aCk7DQotCQkNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlIYXNoTWFwPFN0cmluZyxTdHJpbmc+IHByb2plY3RGYWNldHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOw0KLQkJCQ0KLQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsIDogZXh0c1tpXS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSkNCi0JCQl7DQotCQkJCWlmIChlbC5nZXROYW1lKCkuZXF1YWxzKFhQX1BST0pFQ1RfRkFDRVRfRUxFTUVOVCkpDQotCQkJCXsNCi0JCQkJCXByb2plY3RGYWNldHMucHV0KGVsLmdldEF0dHJpYnV0ZShYUF9QUk9KRUNUX0ZBQ0VUX0lEKSxlbC5nZXRBdHRyaWJ1dGUoWFBfUFJPSkVDVF9GQUNFVF9WRVJTSU9OKSk7DQotCQkJCX0NCi0JCQl9DQotCQkJDQotCQkJDQotCQkJcnVudGltZURlc2NyaXB0b3JzLmFkZChuZXcgUnVudGltZUluZm8oZXh0c1tpXS5nZXRTaW1wbGVJZGVudGlmaWVyKCksIGV4dHNbaV0uZ2V0TGFiZWwoKSwgcHJvamVjdEZhY2V0cykpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcnVudGltZURlc2NyaXB0b3JzOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBkZXNjcmlwdG9yIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcnVudGltZSBpZC4NCi0JICogDQotCSAqIEBwYXJhbSBydW50aW1lSWQgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHJ1bnRpbWUNCi0JICogQHJldHVybiBkZXNjcmlwdG9yIG9iamVjdCBmb3IgdGhlIG5lZWRlZCBydW50aW1lDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElXc0RPTVJ1bnRpbWVJbmZvIGdldFJ1bnRpbWVJbmZvKGZpbmFsIFN0cmluZyBydW50aW1lSWQpDQotCXsNCi0JCUl0ZXJhdG9yPElXc0RPTVJ1bnRpbWVJbmZvPiByZWdpc3RlcmVkUnVudGltZSA9IGdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKS5pdGVyYXRvcigpOw0KLQkJDQotCQl3aGlsZShyZWdpc3RlcmVkUnVudGltZS5oYXNOZXh0KCkpDQotCQl7DQotCQkJSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8gPSByZWdpc3RlcmVkUnVudGltZS5uZXh0KCk7DQotCQkJDQotCQkJaWYocnVudGltZUluZm8uZ2V0SWQoKS5lcXVhbHMocnVudGltZUlkKSkNCi0JCQl7DQotCQkJCXJldHVybiBydW50aW1lSW5mbzsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBJTG9nZ2VyIGxvZ2dlcigpDQotCXsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbTJSZXNvdXJjZU1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbTJSZXNvdXJjZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZWYyNTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgdGFrZXMgY2FyZSBmb3IgbWFwcGluZyBET00gb2JqZWN0cyB0byBFY2xpcHNlIHJlc291cmNlcy4gDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb20yUmVzb3VyY2VNYXBwZXINCi17DQotCS8qKiB0aGUgc2luZ2xldG9uIGluc3RhbmNlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG9tMlJlc291cmNlTWFwcGVyIElOU1RBTkNFID0gbmV3IERvbTJSZXNvdXJjZU1hcHBlcigpOw0KLQkNCi0JcHJpdmF0ZSBEb21Td2l0Y2g8U3RyaW5nPiBpbXBsQ2xhc3NGaW5kZXJTd2l0Y2g7DQotCQ0KLQkvKioNCi0JICogU2luZ2xldG9uIENvbnN0cnVjdG9yIA0KLQkgKi8NCi0JcHJpdmF0ZSBEb20yUmVzb3VyY2VNYXBwZXIoKSB7CQ0KLQkJdGhpcy5pbXBsQ2xhc3NGaW5kZXJTd2l0Y2ggPSBjcmVhdGVJbXBsRmluZGVyU3dpdGNoKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBGaW5kcyB1bmRlcmx5aW5nIHtAbGluayBJUmVzb3VyY2V9IGZvciB0aGlzIERPTSBvYmplY3QNCi0JICogQHBhcmFtIGVPYmplY3QgdGhlIERPTSBvYmplY3QNCi0JICogQHJldHVybiBmb3VuZCByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShlT2JqZWN0KTsNCi0JCXN3aXRjaCAoZU9iamVjdC5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFOg0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRTogDQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0Q6IA0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU06CQ0KLQkJCWZpbmFsIElUeXBlIHR5cGUgPSBmaW5kVHlwZShlT2JqZWN0KTsgDQotCQkJcmV0dXJuIHR5cGU9PW51bGwgPyBudWxsIDogdHlwZS5nZXRSZXNvdXJjZSgpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUOg0KLQkJCXJldHVybiBmaW5kUHJvamVjdCgoSVdlYlNlcnZpY2VQcm9qZWN0KWVPYmplY3QpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBGaW5kcyBJUHJvamVjdCBpbnN0YW5jZSBmb3IgdGhlIHdlYiBzZXJ2aWNlIHByb2plY3QgcmVwcmVzZW50ZWQgYnkgPGNvZGU+d3NQcm9qZWN0PC9jb2RlPg0KLQkgKiBAcGFyYW0gd3NQcm9qZWN0IHRoZSBwcm9qZWN0IERPTSBvYmplY3QNCi0JICogQHJldHVybiBmb3VuZCByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIElQcm9qZWN0IGZpbmRQcm9qZWN0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCWlmICh3c1Byb2plY3QgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh3c1Byb2plY3QuZ2V0TmFtZSgpKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEZpbmRzIHVuZGVybHlpbmcge0BsaW5rIElUeXBlfSBpbnN0YW5jZSBmb3IgdGhpcyA8Y29kZT5lT2JqZWN0PC9jb2RlPiANCi0JICogQHBhcmFtIGVPYmplY3QgdGhlIERPTSBvYmplY3QNCi0JICogQHJldHVybiB0aGUgSVR5cGUgY29udGFpbmluZyB0aGlzIDxjb2RlPmVPYmplY3Q8L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgSVR5cGUgZmluZFR5cGUoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZU9iamVjdCk7DQotCQkNCi0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChEb21VdGlsLklOU1RBTkNFLmZpbmRXc1Byb2plY3QoZU9iamVjdCkpOw0KLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOw0KLQkJZmluYWwgU3RyaW5nIGZxTmFtZSA9IGltcGxDbGFzc0ZpbmRlclN3aXRjaC5kb1N3aXRjaChlT2JqZWN0KTsNCi0JCWlmIChqYXZhUHJvamVjdD09bnVsbCB8fCBmcU5hbWUgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUoZnFOYW1lKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIERvbVN3aXRjaDxTdHJpbmc+IGNyZWF0ZUltcGxGaW5kZXJTd2l0Y2goKQ0KLQl7DQotCQlyZXR1cm4gbmV3IERvbVN3aXRjaDxTdHJpbmc+KCkNCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViU2VydmljZShJV2ViU2VydmljZSB3cykgew0KLQkJCQlyZXR1cm4gd3MuZ2V0SW1wbGVtZW50YXRpb24oKTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIFN0cmluZyBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSkgew0KLQkJCQlyZXR1cm4gc2VpID09IG51bGwgPyBudWxsIDogc2VpLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlXZWJNZXRob2QoSVdlYk1ldGhvZCB3bSkgew0KLQkJCQlyZXR1cm4gd20gPT0gbnVsbCA/IG51bGwgOiBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkgd20uZUNvbnRhaW5lcigpKTsNCi0JCQl9CQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlXZWJQYXJhbShJV2ViUGFyYW0gd3ApIHsNCi0JCQkJcmV0dXJuIGNhc2VJV2ViTWV0aG9kKChJV2ViTWV0aG9kKXdwLmVDb250YWluZXIoKSk7DQotCQkJfQ0KLQkJfTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZmI1M2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGU7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLg0KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb21BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIERvbVBhY2thZ2UgbW9kZWxQYWNrYWdlOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIERvbUFkYXB0ZXJGYWN0b3J5KCkgew0KLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQ0KLQkJew0KLQkJCW1vZGVsUGFja2FnZSA9IERvbVBhY2thZ2UuZUlOU1RBTkNFOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpDQotCQl7DQotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRG9tU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0NCi0JCW5ldyBEb21Td2l0Y2g8QWRhcHRlcj4oKQ0KLQkJew0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJRE9NKElET00gb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlET01BZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KElKYXZhV2ViU2VydmljZUVsZW1lbnQgb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnRBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJV2ViTWV0aG9kKElXZWJNZXRob2Qgb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlXZWJNZXRob2RBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJV2ViU2VydmljZShJV2ViU2VydmljZSBvYmplY3QpDQotCQkJew0KLQkJCQlyZXR1cm4gY3JlYXRlSVdlYlNlcnZpY2VBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJV2ViU2VydmljZVByb2plY3QoSVdlYlNlcnZpY2VQcm9qZWN0IG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJV2ViU2VydmljZVByb2plY3RBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJV2ViVHlwZShJV2ViVHlwZSBvYmplY3QpDQotCQkJew0KLQkJCQlyZXR1cm4gY3JlYXRlSVdlYlR5cGVBZGFwdGVyKCk7DQotCQkJfQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7DQotCQkJfQ0KLQkJfTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuDQotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsNCi0JCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSA8ZW0+SURPTTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSURPTUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQgPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnRBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIDxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kIDxlbT5JV2ViIE1ldGhvZDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSA8ZW0+SVdlYiBQYXJhbTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSA8ZW0+SVdlYiBTZXJ2aWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlNlcnZpY2VBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QgPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlIDxlbT5JV2ViIFR5cGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViVHlwZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIA0KLQl7DQotCQlzeW5jaHJvbml6ZWQgKHRhcmdldCkgew0KLQkJCXJldHVybiBzdXBlci5hZGFwdCh0YXJnZXQsIHR5cGUpOw0KLQkJfQ0KLQl9DQotCQ0KLX0gLy9Eb21BZGFwdGVyRmFjdG9yeQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21Td2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb21Td2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODk1MjE0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4NCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9DQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLA0KLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0DQotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQ0KLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLA0KLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZQ0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tU3dpdGNoPFQ+IHsNCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQ0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBEb21QYWNrYWdlIG1vZGVsUGFja2FnZTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21Td2l0Y2goKSB7DQotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpDQotCQl7DQotCQkJbW9kZWxQYWNrYWdlID0gRG9tUGFja2FnZS5lSU5TVEFOQ0U7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7DQotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpDQotCQl7DQotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7DQotCQkJcmV0dXJuDQotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/DQotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6DQotCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgew0KLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET006DQotCQkJew0KLQkJCQlJRE9NIGlkb20gPSAoSURPTSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJRE9NKGlkb20pOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVDoNCi0JCQl7DQotCQkJCUlKYXZhV2ViU2VydmljZUVsZW1lbnQgaUphdmFXZWJTZXJ2aWNlRWxlbWVudCA9IChJSmF2YVdlYlNlcnZpY2VFbGVtZW50KXRoZUVPYmplY3Q7DQotCQkJCVQgcmVzdWx0ID0gY2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoaUphdmFXZWJTZXJ2aWNlRWxlbWVudCk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6DQotCQkJew0KLQkJCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0Q6DQotCQkJew0KLQkJCQlJV2ViTWV0aG9kIGlXZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViTWV0aG9kKGlXZWJNZXRob2QpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlXZWJNZXRob2QpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTToNCi0JCQl7DQotCQkJCUlXZWJQYXJhbSBpV2ViUGFyYW0gPSAoSVdlYlBhcmFtKXRoZUVPYmplY3Q7DQotCQkJCVQgcmVzdWx0ID0gY2FzZUlXZWJQYXJhbShpV2ViUGFyYW0pOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlXZWJQYXJhbSk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0U6DQotCQkJew0KLQkJCQlJV2ViU2VydmljZSBpV2ViU2VydmljZSA9IChJV2ViU2VydmljZSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViU2VydmljZShpV2ViU2VydmljZSk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoaVdlYlNlcnZpY2UpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1Q6DQotCQkJew0KLQkJCQlJV2ViU2VydmljZVByb2plY3QgaVdlYlNlcnZpY2VQcm9qZWN0ID0gKElXZWJTZXJ2aWNlUHJvamVjdCl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViU2VydmljZVByb2plY3QoaVdlYlNlcnZpY2VQcm9qZWN0KTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfVFlQRToNCi0JCQl7DQotCQkJCUlXZWJUeXBlIGlXZWJUeXBlID0gKElXZWJUeXBlKXRoZUVPYmplY3Q7DQotCQkJCVQgcmVzdWx0ID0gY2FzZUlXZWJUeXBlKGlXZWJUeXBlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpV2ViVHlwZSk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SURPTTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklET008L2VtPicuDQotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgVCBjYXNlSURPTShJRE9NIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoSUphdmFXZWJTZXJ2aWNlRWxlbWVudCBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicuDQotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgVCBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBNZXRob2Q8L2VtPicuDQotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgVCBjYXNlSVdlYk1ldGhvZChJV2ViTWV0aG9kIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgUGFyYW08L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFBhcmFtPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJQYXJhbShJV2ViUGFyYW0gb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBTZXJ2aWNlPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJTZXJ2aWNlKElXZWJTZXJ2aWNlIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicuDQotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgVCBjYXNlSVdlYlNlcnZpY2VQcm9qZWN0KElXZWJTZXJ2aWNlUHJvamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFR5cGU8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFR5cGU8L2VtPicuDQotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgVCBjYXNlSVdlYlR5cGUoSVdlYlR5cGUgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfSAvL0RvbVN3aXRjaA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9KZWU1RG9tVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9KZWU1RG9tVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ1NWQ3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvSmVlNURvbVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBVdGlsaXR5IGZvciBzb21lIHNwZWNpZmljYXRpb24gc3BlY2lmaWMgbG9naWNzIHRoYXQgYXJlIGZyZXF1ZW50bHkgdXNlZA0KLSAqIHdoaWxlIGRlYWxpbmcgd2l0aCBET00gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEplZTVEb21VdGlscyANCi17DQotCS8qKiB0aGUgc2luZ2xldG9uIGluc3RhbmNlICovDQotCXByaXZhdGUgc3RhdGljIEplZTVEb21VdGlscyBpbnN0YW5jZTsNCi0JDQotCXByaXZhdGUgSmVlNURvbVV0aWxzKCkgew0KLQkJLy8gc2luZ2xldG9uDQotCX0NCi0JDQotCS8qKg0KLQkgKiBNZXRob2QgdGhhdCBkZWNpZGVzIGlmIHRoZSBhdHRyaWJ1dGUgJ3BhcnROYW1lJyBpcyB1c2VkIGF0IGFsbCBhY2NvcmRpbmcgDQotCSAqIHRvIEpTUi0xODEgc2VjdGlvbiA0LjQuMSAtIGF0dHJpYnV0ZSAncGFydE5hbWUnIGNvbHVtbiAnbWVhbmluZycuDQotCSAqIEBwYXJhbSB3ZWJQYXJhbSB0aGUgd2ViUGFyYW0gdG8gYmUgY2hlY2tlZA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgcGFydE5hbWUgaXMgdXNlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0TmFtZVVzZWQoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsNCi0JCQ0KLQkJcmV0dXJuIHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuUlBDIHx8IA0KLQkJCXdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk9PVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIE1ldGhvZCB0aGF0IGRlY2lkZXMgaXMgdGhlIGF0dHJpYnV0ZSAnbmFtZScgaXMgdXNlZCBhdCBhbGwNCi0JICogYWNjb3JkaW5nIHRvIEpTUi0xODEgc2VjdGlvbiA0LjQuMSAtIGF0dHJpYnV0ZSAnbmFtZScgY29sdW1uICdtZWFuaW5nJw0KLQkgKiBAcGFyYW0gd2ViUGFyYW0NCi0JICogQHJldHVybiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSBuYW1lIGlzIHVzZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTmFtZVVzZWQoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsNCi0JCWlmKCB3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UIHx8IHdlYlBhcmFtLmlzSGVhZGVyKCkgKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSAgZmluZEFubm90YXRpb24od2ViUGFyYW0sIFdQX0FOTk9UQVRJT04pOw0KLQkJaWYgKGFubm90YXRpb249PW51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXJldHVybiBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuUEFSVF9OQU1FX0FUVFJJQlVURSk9PW51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGV4dHJhY3QgYW5ub3RhdGlvbiB3aXRoIGZ1bGx5IHF1YWxpZmllZCBuYW1lIDxjb2RlPmFubkZRTmFtZTwvY29kZT4NCi0JICogQHBhcmFtIGVPYmplY3QgdGhlIG9iamVjdCB0byBzZWFyY2ggaW4NCi0JICogQHBhcmFtIGFubkZRTmFtZSB0aGUgRlEgbmFtZSBvZiBzZWFyY2hlZCBhbm5vdGF0aW9uIA0KLQkgKiBAcmV0dXJuIGZvdW5kIGFubm90YXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBmaW5kQW5ub3RhdGlvbihmaW5hbCBFT2JqZWN0IGVPYmplY3QsIGZpbmFsIFN0cmluZyBhbm5GUU5hbWUpIA0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChJQW5ub3RhdGlvbkFkYXB0ZXIpQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KGVPYmplY3QsIElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcyk7DQotCQlpZiAoYWRhcHRlciE9bnVsbCkgew0KLQkJCXJldHVybiBhZGFwdGVyLmdldEFubm90YXRpb24oYW5uRlFOYW1lKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBNZXRob2QgdGhhdCBkZWNpZGVzIGlmIHRoZSBwYXJhbSBuYW1lIGlzIHJlcXVpcmVkIHRvIGJlIHB1dCBpbiB0aGUgYW5ub3RhdGlvbiBhY2NvcmRpbmcgDQotCSAqIHRvIEpTUi0xODEgc2VjdGlvbiA0LjQuMSAtIGF0dHJpYnV0ZSAnbmFtZScgY29sdW1uICdtZWFuaW5nJy4NCi0JICogQHBhcmFtIHdlYlBhcmFtDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5hbWUgYXR0cmlidXRlIHNob3VsZCBiZSBwdXQgb24gYW5ub3RhdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNOYW1lUmVxdWlyZWQoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsNCi0JCQ0KLQkJaWYgKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQgJiYNCi0JCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUgJiYNCi0JCQkod2ViUGFyYW0uZ2V0S2luZCgpPT1XZWJQYXJhbUtpbmQuSU5PVVQgfHwgd2ViUGFyYW0uZ2V0S2luZCgpPT1XZWJQYXJhbUtpbmQuT1VUKSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0JDQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEplZTVEb21VdGlscyBnZXRJbnN0YW5jZSgpDQotCXsNCi0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7DQotCQkJaW5zdGFuY2UgPSBuZXcgSmVlNURvbVV0aWxzKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBpbnN0YW5jZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvTG9jYXRvckV4dHJhY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0xvY2F0b3JFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWEzNjFjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvTG9jYXRvckV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi0NCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGV4dHJhY3RzIHtAbGluayBJTG9jYXRvcn0gb3V0IG9mIERPTSBvYmplY3QNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIExvY2F0b3JFeHRyYWN0b3IgDQotew0KLQlwcml2YXRlIHN0YXRpYyBMb2NhdG9yRXh0cmFjdG9yIGluc3RhbmNlOw0KLQkNCi0JcHJpdmF0ZSBMb2NhdG9yRXh0cmFjdG9yKCkgew0KLQkJLy8gc2luZ2xldG9uIGluc3RhbmNlDQotCX0NCi0JDQotCS8qKg0KLQkgKiBFeHRyYWN0cyB0aGUge0BsaW5rIElMb2NhdG9yfSAgDQotCSAqIEBwYXJhbSBlT2JqZWN0DQotCSAqIEByZXR1cm4ge0BsaW5rIElMb2NhdG9yfSBpbnN0YW5jZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpbiBjYXNlIHRoZSB7QGxpbmsgSUphdmFFbGVtZW50fSANCi0JICogY2Fubm90IGJlIGZvdW5kIGZvciB0aGlzIDxjb2RlPmVPYmplY3Q8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+ZU9iamVjdDwvY29kZT4gaXMgRE9NIG9iamVjdCBmb3Igd2hpY2gNCi0JICogdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIA0KLQkgKi8NCi0JcHVibGljIElMb2NhdG9yIGZpbmQoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IGZpbmRJVHlwZShlT2JqZWN0KTsNCi0JCWlmIChzZWlUeXBlID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJc3dpdGNoKGVPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIA0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EOg0KLQkJCXJldHVybiBnZXRMb2NhdG9yRm9yTWV0aG9kKHNlaVR5cGUsIChJV2ViTWV0aG9kKWVPYmplY3QpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToNCi0JCQlyZXR1cm4gZ2V0UG9zaXRpb24oc2VpVHlwZSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFOg0KLQkJCXJldHVybiBnZXRQb3NpdGlvbihzZWlUeXBlKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOg0KLQkJCXJldHVybiBnZXRMb2NhdG9yRm9yTWV0aG9kKHNlaVR5cGUsIChJV2ViTWV0aG9kKWVPYmplY3QuZUNvbnRhaW5lcigpKTsNCi0JCX0NCi0JCQ0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBvYmplY3QgdHlwZSIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9jYXRvciBnZXRMb2NhdG9yRm9yTWV0aG9kKGZpbmFsIElUeXBlIHNlaVR5cGUsIGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZE1ldGhvZChzZWlUeXBlLCB3ZWJNZXRob2QpOw0KLQkJaWYgKG1ldGhvZCE9bnVsbCkgew0KLQkJCXJldHVybiBnZXRQb3NpdGlvbihtZXRob2QpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJVHlwZSBmaW5kSVR5cGUoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCXJldHVybiBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0UuZmluZFR5cGUoZU9iamVjdCk7DQotCX0NCi0JDQotCXByaXZhdGUgSUxvY2F0b3IgZ2V0UG9zaXRpb24oZmluYWwgSU1lbWJlciBtZW1iZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBpbnQgb2Zmc2V0ID0gbWVtYmVyLmdldE5hbWVSYW5nZSgpLmdldE9mZnNldCgpOw0KLQkJZmluYWwgaW50IGxlbmd0aCA9IG1lbWJlci5nZXROYW1lUmFuZ2UoKS5nZXRMZW5ndGgoKTsNCi0JCWZpbmFsIGludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihtZW1iZXIpOw0KLQkJDQotCQlyZXR1cm4gbmV3IElMb2NhdG9yKCkgDQotCQl7CQkJDQotCQkJcHVibGljIGludCBnZXRTdGFydFBvc2l0aW9uKCkgew0KLQkJCQlyZXR1cm4gb2Zmc2V0Ow0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsJCQkJDQotCQkJCXJldHVybiBsZW5ndGg7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsNCi0JCQkJcmV0dXJuIGxpbmVOdW1iZXI7DQotCQkJfQ0KLQkJfTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBpbnQgZ2V0TGluZU51bWJlcihmaW5hbCBJTWVtYmVyIG1lbWJlcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudChtZW1iZXIuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKSk7DQotCQkNCi0JCXJldHVybiBkb2MuZ2V0TGluZU9mT2Zmc2V0KG1lbWJlci5nZXROYW1lUmFuZ2UoKS5nZXRPZmZzZXQoKSkgKyAxOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIExvY2F0b3JFeHRyYWN0b3IgZ2V0SW5zdGFuY2UoKQ0KLQl7DQotCQlpZiAoaW5zdGFuY2U9PW51bGwpIHsNCi0JCQlpbnN0YW5jZSA9IG5ldyBMb2NhdG9yRXh0cmFjdG9yKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBpbnN0YW5jZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvUGFyYW1WYWx1ZUNvbXBhcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9QYXJhbVZhbHVlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTc3MjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9QYXJhbVZhbHVlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgY29tcGFyZXMge0BsaW5rIElQYXJhbVZhbHVlUGFpcn0gYnkgcHJvcGVydHkgbmFtZS4gSW50ZW5kZWQgdG8gYmUgdXNlZCB3aGVuIA0KLSAqIGNyZWF0aW5nIGEge0BsaW5rIFRyZWVTZXR9IGZvciBhbm5vdGF0aW9uIHByb3BlcnRpZXMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8SVBhcmFtVmFsdWVQYWlyPg0KLXsJCQ0KLQlwdWJsaWMgZW51bSBPcmRlciB7Tm9ybWFsLCBSZXZlcnNlZH07DQotDQotCXByaXZhdGUgZmluYWwgT3JkZXIgb3JkZXI7DQotCQ0KLQlwdWJsaWMgUGFyYW1WYWx1ZUNvbXBhcmF0b3IoKSB7DQotCQlvcmRlciA9IE9yZGVyLk5vcm1hbDsNCi0JfQ0KLQkNCi0JcHVibGljIFBhcmFtVmFsdWVDb21wYXJhdG9yKGZpbmFsIE9yZGVyIG9yZGVyKSB7DQotCQl0aGlzLm9yZGVyID0gb3JkZXI7DQotCX0NCi0NCi0JDQotCXB1YmxpYyBpbnQgY29tcGFyZShJUGFyYW1WYWx1ZVBhaXIgbzEsIElQYXJhbVZhbHVlUGFpciBvMikgDQotCXsNCi0JCWlmKG9yZGVyPT1PcmRlci5Ob3JtYWwpIHsNCi0JCQlyZXR1cm4gbzEuZ2V0UGFyYW0oKS5jb21wYXJlVG8obzIuZ2V0UGFyYW0oKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBvMi5nZXRQYXJhbSgpLmNvbXBhcmVUbyhvMS5nZXRQYXJhbSgpKTsNCi0JfQkJDQotfQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2I0NjVhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklDb25zdHJhaW50U3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5Nb2RlbENvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSUNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbTJSZXNvdXJjZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuSmVlNURvbVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Mb2NhdG9yRXh0cmFjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5pbXBsLkNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uaW1wbC5Qcm9ibGVtTG9jYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogQmFzZSBjbGFzcyB0byBiZSB1c2VkIGJ5IG90aGVyIERPTSBjb25zdHJhaW50cy4gUHJvdmlkZXMgdXNlZnVsIG1ldGhvZHMgZm9yDQotICogY3JlYXRpbmcge0BsaW5rIElDb25zdHJhaW50U3RhdHVzfSBkdXJpbmcgdmFsaWRhdGlvbiwgZXh0cmFjdGlvbiBvZiANCi0gKiBlcnJvciBsb2NhdGlvbiBldGMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50IGV4dGVuZHMgTW9kZWxDb25zdHJhaW50DQotew0KLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyOw0KLQlwcml2YXRlIEplZTVEb21VdGlscyBqZWU1RG9tVXRpbDsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciANCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgLSB0aGUge0BsaW5rIElDb25zdHJhaW50RGVzY3JpcHRvcn0gZm9yIHRoZSBzcGVjaWZpYyBjb25zdHJhaW50DQotCSAqIHNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50KElDb25zdHJhaW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7DQotCQlzdXBlcihkZXNjcmlwdG9yKTsNCi0JCQ0KLQkJbnVsbENoZWNrUGFyYW0oZGVzY3JpcHRvciwgImRlc2NyaXB0b3IiKTsvLyROT04tTkxTLTEkDQotCQlsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7DQotCQlqZWU1RG9tVXRpbCA9IEplZTVEb21VdGlscy5nZXRJbnN0YW5jZSgpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQWJzdHJhY3QgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSByZWFsIHZhbGlkYXRpb24gaGF2ZSB0byB0YWtlIHBsYWNlLiBPdmVycmlkZQ0KLQkgKiB0aGlzIG1ldGhvZCBhbmQgaW1wbGVtZW50IHlvdXIgdmFsaWRhdGlvbiBsb2dpYy4gDQotCSAqIEBwYXJhbSBjdHggdGhlIHZhbGlkYXRpb24gY29udGV4dCANCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHlvdXIgdmFsaWRhdGlvbg0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICovDQotCXByb3RlY3RlZCBhYnN0cmFjdCBJU3RhdHVzIGRvVmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIENvcmVFeGNlcHRpb247IA0KLQ0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSANCi0Jew0KLQkJdHJ5IHsNCi0JCQlyZXR1cm4gZG9WYWxpZGF0ZShjdHgpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQkNCi0JCQ0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIE9LIHN0YXR1cw0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB2YWxpZGF0ZWQgb2JqZWN0DQotCSAqIEByZXR1cm4ge0BsaW5rIElDb25zdHJhaW50U3RhdHVzfSBpbnN0YW5jZSB3aXRoIHNldmVyaXR5IHtAbGluayBJU3RhdHVzI09LfQ0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIElDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQgY3JlYXRlT2tTdGF0dXMoRU9iamVjdCBvYmplY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIG5ldyBDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQodGhpcywgb2JqZWN0LCBJU3RhdHVzLk9LLCAwLCAiIiwgbmV3IEhhc2hTZXQ8SVByb2JsZW1Mb2NhdGlvbj4oMCkpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElDb25zdHJhaW50U3RhdHVzfSBpbnN0YW5jZSB3aXRoIHNldmVyaXR5IGRlcGVuZGluZyBvbiB0aGUgc2V2ZXJpdHkgZGVmaW5lZCBieSANCi0JICoge0BsaW5rIElDb25zdHJhaW50RGVzY3JpcHRvciNnZXRTZXZlcml0eSgpfS4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdmFsaWRhdGVkIG9iamVjdA0KLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQNCi0JICogQHBhcmFtIGFubkZRTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb24gdGhlIGFubm90YXRpb24gdmFsaWRhdGVkDQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdmFsaWRhdGVkDQotCSAqIEByZXR1cm4gY3JlYXRlZCBvYmplY3QNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXByb3RlY3RlZCBJQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkIGNyZWF0ZVN0YXR1cyhFT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBhbm5GUU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMob2JqZWN0LCBtZXNzYWdlLCBnZXRMb2NhdG9yKG9iamVjdCwgYW5uRlFOYW1lLCBhdHRyaWJ1dGVOYW1lKSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkIGNyZWF0ZVN0YXR1cyhmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIElQcm9ibGVtTG9jYXRpb24gbG9jYXRvcikgDQotCXsNCi0JCWZpbmFsIFNldDxJUHJvYmxlbUxvY2F0aW9uPiBwcm9ibGVtcyA9IG5ldyBIYXNoU2V0PElQcm9ibGVtTG9jYXRpb24+KDEpOw0KLQkJcHJvYmxlbXMuYWRkKGxvY2F0b3IpOw0KLQkJDQotCQlyZXR1cm4gbmV3IENvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCh0aGlzLCBvYmplY3QsIG1lc3NhZ2UsIHByb2JsZW1zKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVByb2JsZW1Mb2NhdGlvbn0gaW5zdGFuY2Ugb3V0IG9mIHtAbGluayBFT2JqZWN0fSBpbnN0YW5jZS4gDQotCSAqIERlZmluZXMgd2hpY2ggaXMgdGhlIHtAbGluayBJUmVzb3VyY2V9IGNvbnRhaW5pbmcgdGhpcyBET00gb2JqZWN0IGFuZCB0cmllcyB0byANCi0JICogZXh0cmFjdCB7QGxpbmsgSUxvY2F0b3J9Lg0KLQkgKiBAcGFyYW0gZU9iamVjdA0KLQkgKiBAcGFyYW0gYW5uRlFOYW1lDQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lDQotCSAqIEByZXR1cm4gY3JlYXRlZCBsb2NhdGlvbg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIElQcm9ibGVtTG9jYXRpb24gZ2V0TG9jYXRvcihFT2JqZWN0IGVPYmplY3QsIFN0cmluZyBhbm5GUU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKElBbm5vdGF0aW9uQWRhcHRlcilBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoZU9iamVjdCwgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhbm5GUU5hbWU9PW51bGwgPyBudWxsIDogYWRhcHRlci5nZXRBbm5vdGF0aW9uKGFubkZRTmFtZSk7DQotCQlpZiAoYW5ub3RhdGlvbj09bnVsbCkgew0KLQkJCXJldHVybiBuZXcgUHJvYmxlbUxvY2F0aW9uKGZpbmRSZXNvdXJjZShlT2JqZWN0KSwgZ2V0TG9jYXRvckZvckltcGxlbWVudGF0aW9uKGVPYmplY3QpKTsNCi0JCX0NCi0JCQ0KLQkJSUxvY2F0b3IgbG9jYXRvciA9IG51bGw7DQotCQlpZiAoYXR0cmlidXRlTmFtZSAhPSBudWxsKSB7DQotCQkJbG9jYXRvciA9IGdldExvY2F0b3JGb3JBdHRyaWJ1dGVWYWx1ZShhbm5vdGF0aW9uLCBhdHRyaWJ1dGVOYW1lKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGxvY2F0b3IgPT0gbnVsbCkgew0KLQkJCWxvY2F0b3IgPSBhbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG5ldyBQcm9ibGVtTG9jYXRpb24oYW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldFJlc291cmNlKCksIGxvY2F0b3IpOw0KLQl9DQotDQotCXByb3RlY3RlZCBJTG9jYXRvciBnZXRMb2NhdG9yRm9yQXR0cmlidXRlVmFsdWUoSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpDQotCXsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhaXIgOiBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpKSANCi0JCXsNCi0JCQlpZihwYWlyLmdldFBhcmFtKCkuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKSB7DQotCQkJCXJldHVybiBwYWlyLmdldFZhbHVlKCkuZ2V0TG9jYXRvcigpOyANCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUxvY2F0b3IgZ2V0TG9jYXRvckZvckltcGxlbWVudGF0aW9uKGZpbmFsIEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAgew0KLQkJdHJ5IHsNCi0JCQlyZXR1cm4gTG9jYXRvckV4dHJhY3Rvci5nZXRJbnN0YW5jZSgpLmZpbmQoZU9iamVjdCk7DQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UoRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCXJldHVybiBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0UuZmluZFJlc291cmNlKGVPYmplY3QpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZmluZEFubm90YXRpb24oZmluYWwgRU9iamVjdCBlT2JqZWN0LCBmaW5hbCBTdHJpbmcgYW5uRlFOYW1lKSANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSUFubm90YXRpb25BZGFwdGVyKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChlT2JqZWN0LCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhbm5GUU5hbWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUxvZ2dlciBsb2dnZXIoKSB7DQotCQlyZXR1cm4gbG9nZ2VyOw0KLQl9DQotDQotCXByb3RlY3RlZCBKZWU1RG9tVXRpbHMgamVlNURvbVV0aWwoKSB7DQotCQlyZXR1cm4gamVlNURvbVV0aWw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDcwNjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkNhdGVnb3J5TWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuRXZhbHVhdGlvbk1vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuQWJzdHJhY3RDb25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJhaW50RGVzY3JpcHRvcg0KLXsNCi0JcHVibGljIERvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvcigpIHsNCi0JCWFkZENhdGVnb3J5KENhdGVnb3J5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldENhdGVnb3J5KCJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUiKSk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldEJvZHkoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgew0KLQkJcmV0dXJuIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkRvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvcl9XU19ET01fVkFMSURBVElPTl9DT05TVFJBSU5UOw0KLQl9DQotDQotCXB1YmxpYyBFdmFsdWF0aW9uTW9kZTxFT2JqZWN0PiBnZXRFdmFsdWF0aW9uTW9kZSgpIHsNCi0JCXJldHVybiBFdmFsdWF0aW9uTW9kZS5CQVRDSDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VQYXR0ZXJuKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkRvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvcl9XU19ET01fVkFMSURBVElPTl9DT05TVFJBSU5UOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIHRhcmdldHNFdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiB0YXJnZXRzVHlwZU9mKEVPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vRG9tVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0RvbVZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzc2NGI5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vRG9tVmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbC5YcFV0aWw7DQotDQotLyoqDQotICogU2luZ2xldG9uIGZhY3RvcnkgdXNlZCB0byBpbnN0YW50aWF0ZSByZWdpc3RlcmVkIERPTSB2YWxpZGF0b3JzLiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIERvbVZhbGlkYXRvckZhY3RvcnkgDQotew0KLQkvKiogVGhlIGV4dGVuc2lvbiBwb2ludCBJRCAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET01fVkFMSURBVElPTl9YUCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuZG9tVmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqIEZhY3RvcnkncyBzaW5nbGV0b24gaW5zdGFuY2UgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEb21WYWxpZGF0b3JGYWN0b3J5IElOU1RBTkNFID0gbmV3IERvbVZhbGlkYXRvckZhY3RvcnkoKTsNCi0JDQotCXByaXZhdGUgRG9tVmFsaWRhdG9yRmFjdG9yeSgpIHsNCi0JCS8vIHNpbmdsZXRvbg0KLQl9DQotCQ0KLQkvKioNCi0JICogRXh0cmFjdHMgYWxsIHJlZ2lzdGVyZWQgRE9NIHZhbGlkYXRvcnMuDQotCSAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiBhbGwgcmVnaXN0ZXJlZCBET00gdmFsaWRhdG9ycw0KLQkgKi8NCi0JcHVibGljIENvbGxlY3Rpb248SURvbVZhbGlkYXRvcj4gZ2V0UmVnaXN0ZXJlZFZhbGlkYXRvcnMoKQ0KLQl7DQotCQlmaW5hbCBMaXN0PElEb21WYWxpZGF0b3I+IHZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0PElEb21WYWxpZGF0b3I+KCk7DQotCQlmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KERPTV9WQUxJREFUSU9OX1hQKTsNCi0JCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCkpIHsNCi0JCQl2YWxpZGF0b3JzLmFkZCgoKElEb21WYWxpZGF0b3IpIFhwVXRpbC5pbnN0YW50aWF0ZUltcGxlbWVudGF0aW9uKGV4dGVuc2lvbikpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHZhbGlkYXRvcnM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0lDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9JQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViN2M2NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0lDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklDb25zdHJhaW50U3RhdHVzOw0KLQ0KLS8qKg0KLSAqIEV4dGVuZGVkIGNvbnN0cmFpbnQgc3RhdHVzIHdoaWNoIGNhcnJpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2JsZW0gbG9jYXRpb24gDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQgZXh0ZW5kcyBJQ29uc3RyYWludFN0YXR1cw0KLXsNCi0JLyoqDQotCSAqIEdldHMgdGhlIHNldCBvZiB0aGUgcHJvYmxlbSBsb2NhdGlvbnMuIFRoZSByZXN1bHQgaXMgYW4gdW5tb2RpZmlhYmxlIHNldCANCi0JICogQHJldHVybiBzZXQgb2YgcHJvYmxlbSBsb2NhdGlvbnM7IGVtcHR5IHNldCBpZiBub25lDQotCSAqLw0KLQlwdWJsaWMgU2V0PElQcm9ibGVtTG9jYXRpb24+IGdldFByb2JsZW1Mb2NhdGlvbnMoKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0lEb21WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9JRG9tVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5MjY2YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0lEb21WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaWYgeW91IGludGVuZCB0byBpbXBsZW1lbnQgc3BlY2lmaWMgRE9NIHJ1bnRpbWUgdmFsaWRhdGlvbi4NCi0gKiBZb3UgbmVlZCB0byByZWdpc3RlciB0aGUgdmFsaWRhdG9yIHVzaW5nIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5kb21WYWxpZGF0b3INCi0gKiBleHRlbnNpb24gcG9pbnQgYW5kIHNwZWNpZnkgZm9yIHdoaWNoIERPTSBydW50aW1lIHZlcnNpb24gaXQgd2lsbCBiZSByZWxldmFudC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJRG9tVmFsaWRhdG9yIA0KLXsNCi0JLyoqDQotCSAqIENhbGxlZCB3aGVuIHZhbGlkYXRpb24gaXMgdHJpZ2dlcmVkIC0gZm9yIGRldGFpbHMgc2VlIFdTVCB2YWxpZGF0aW9uIGZyYW1ld29yayBhbmQNCi0JICogRG9tVmFsaWRhdGlvbk1hbmFnZXIuDQotCSAqIEBwYXJhbSBvYmplY3Qgb2JqZWN0IHRvIGJlIHZhbGlkYXRlZA0KLQkgKiBAcmV0dXJuIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMNCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKEVPYmplY3Qgb2JqZWN0KTsNCi0JDQotCS8qKg0KLQkgKiBIZXJlIHlvdSBtdXN0IHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgSUQgd2hpY2ggdGhpcyB2YWxpZGF0b3Igc3VwcG9ydHMNCi0JICogQHJldHVybiBET00gcnVudGltZSBJRA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRTdXBwb3J0ZWREb21SdW50aW1lKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9JUHJvYmxlbUxvY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vSVByb2JsZW1Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjBjYTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9JUHJvYmxlbUxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB3aGVyZSB0aGUgcHJvYmxlbSBtYXJrZXIgc2hvdWxkIGJlIHNldC9yZW1vdmVkIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9ibGVtTG9jYXRpb24gDQotew0KLQkvKioNCi0JICogVGhlIHJlc291cmNlIG9uIHdoaWNoIHRoZSBtYXJrZXIgdG8gYmUgc2V0IG9yIHJlbW92ZWQNCi0JICogQHJldHVybiBub3QgPGNvZGU+bnVsbDwvY29kZT4ge0BsaW5rIElSZXNvdXJjZX0gaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKTsNCi0JDQotCS8qKg0KLQkgKiBUaGUgZXhhY3QgbG9jYXRpb24gaW4gY29kZSB3aGVyZSB0aGUgbWFya2VyIHRvIGJlIHB1dA0KLQkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSUxvY2F0b3J9IGluc3RhbmNlIHRvIGRlZmluZSB0aGUgc3RhcnQgY2hhciBhbmQgbGVuZ3RoIG9mIHRleHQNCi0JICogdG8gYmUgdW5kZXJsaW5lZCBieSB0aGUgbWFya2VyLiBUaGlzIG1ldGhvZCBtaWdodCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZQ0KLQkgKiBsb2NhdGlvbiBpbmZvIGlzIG5vdCByZWxldmFudCAtIGZvciBleGFtcGxlIHdoZW4gbWFya2VyIGp1c3QgbmVlZHMgdG8gYmUgcmVtb3ZlZC4NCi0JICovDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9KYXhXc0RvbVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0pheFdzRG9tVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyYTU4NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL0pheFdzRG9tVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkV2YWx1YXRpb25Nb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLklCYXRjaFZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JVHJhdmVyc2FsU3RyYXRlZ3k7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuTW9kZWxWYWxpZGF0aW9uU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb247DQotDQotLyoqDQotICogSkFYLVdTIHJ1bnRpbWUgRE9NIHZhbGlkYXRvci4gUmVnaXN0ZXJlZCB0byB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgDQotICogdG8gY29udHJpYnV0ZSB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF4V3NEb21WYWxpZGF0b3IgaW1wbGVtZW50cyBJRG9tVmFsaWRhdG9yIA0KLXsNCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoRU9iamVjdCBvYmplY3QpIA0KLQl7DQotCQlmaW5hbCBJQmF0Y2hWYWxpZGF0b3IgdmFsaWRhdG9yID0gKElCYXRjaFZhbGlkYXRvcikgTW9kZWxWYWxpZGF0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLm5ld1ZhbGlkYXRvcihFdmFsdWF0aW9uTW9kZS5CQVRDSCk7DQotCQl2YWxpZGF0b3Iuc2V0SW5jbHVkZUxpdmVDb25zdHJhaW50cyh0cnVlKTsNCi0JCXZhbGlkYXRvci5zZXRSZXBvcnRTdWNjZXNzZXModHJ1ZSk7DQotCQl2YWxpZGF0b3IuZ2V0Q29uc3RyYWludEZpbHRlcnMoKTsNCi0JCXZhbGlkYXRvci5zZXRUcmF2ZXJzYWxTdHJhdGVneShuZXcgSVRyYXZlcnNhbFN0cmF0ZWd5LlJlY3Vyc2l2ZSgpKTsNCi0NCi0JCXZhbGlkYXRvci52YWxpZGF0ZShvYmplY3QsIG51bGwpOw0KLQ0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRTdXBwb3J0ZWREb21SdW50aW1lKCkgewkNCi0JCXJldHVybiBKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLklEOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9Xc0R5bmFtaWNNb2RlbENvbnN0cmFpbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL1dzRHluYW1pY01vZGVsQ29uc3RyYWludFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5YjY0YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL1dzRHluYW1pY01vZGVsQ29uc3RyYWludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuSU1vZGVsQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JTW9kZWxDb25zdHJhaW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tU3dpdGNoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5zZWkuU2VpQ29uc3RyYWludFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJtZXRob2QuV21Db25zdHJhaW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnBhcmFtLldwQ29uc3RyYWludFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlLldzQ29uc3RyYWludFByb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBXc0R5bmFtaWNNb2RlbENvbnN0cmFpbnRQcm92aWRlciBpbXBsZW1lbnRzIElNb2RlbENvbnN0cmFpbnRQcm92aWRlciANCi17DQotCXByaXZhdGUgZmluYWwgRG9tU3dpdGNoPENvbGxlY3Rpb248SU1vZGVsQ29uc3RyYWludD4+IGRvbVN3aXRjaDsNCi0JcHJpdmF0ZSBmaW5hbCBXc0NvbnN0cmFpbnRQcm92aWRlciB3c1Byb3ZpZGVyOw0KLQlwcml2YXRlIGZpbmFsIFNlaUNvbnN0cmFpbnRQcm92aWRlciBzZWlQcm92aWRlcjsNCi0JcHJpdmF0ZSBmaW5hbCBXbUNvbnN0cmFpbnRQcm92aWRlciB3bVByb3ZpZGVyOw0KLQlwcml2YXRlIGZpbmFsIFdwQ29uc3RyYWludFByb3ZpZGVyIHdwUHJvdmlkZXI7DQotCQ0KLQkNCi0JcHVibGljIFdzRHluYW1pY01vZGVsQ29uc3RyYWludFByb3ZpZGVyKCkNCi0Jew0KLQkJZG9tU3dpdGNoID0gY3JlYXRlRG9tU3dpdGNoKCk7DQotCQl3c1Byb3ZpZGVyID0gbmV3IFdzQ29uc3RyYWludFByb3ZpZGVyKCk7DQotCQlzZWlQcm92aWRlciA9IG5ldyBTZWlDb25zdHJhaW50UHJvdmlkZXIoKTsNCi0JCXdtUHJvdmlkZXIgPSBuZXcgV21Db25zdHJhaW50UHJvdmlkZXIoKTsNCi0JCXdwUHJvdmlkZXIgPSBuZXcgV3BDb25zdHJhaW50UHJvdmlkZXIoKTsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEJhdGNoQ29uc3RyYWludHMoRU9iamVjdCBlT2JqZWN0LCBDb2xsZWN0aW9uIGNvbnN0cmFpbnRzKSANCi0Jew0KLQkJZmluYWwgQ29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50PiBtb2RlbENvbnN0cmFpbnRzID0gZG9tU3dpdGNoLmRvU3dpdGNoKGVPYmplY3QpOw0KLQkJaWYgKG1vZGVsQ29uc3RyYWludHMhPW51bGwpIHsNCi0JCQljb25zdHJhaW50cy5hZGRBbGwobW9kZWxDb25zdHJhaW50cyk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjb25zdHJhaW50czsNCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TGl2ZUNvbnN0cmFpbnRzKE5vdGlmaWNhdGlvbiBhcmcwLCBDb2xsZWN0aW9uIGNvbnN0cmFpbnRzKSB7DQotCQlyZXR1cm4gY29uc3RyYWludHM7DQotCX0NCi0NCi0JcHJpdmF0ZSBEb21Td2l0Y2g8Q29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50Pj4gY3JlYXRlRG9tU3dpdGNoKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBEb21Td2l0Y2g8Q29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50Pj4oKSANCi0JCXsNCi0JCQlwdWJsaWMgQ29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50PiBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugb2JqZWN0KSB7CQkJCQ0KLQkJCQlyZXR1cm4gd3NQcm92aWRlci5nZXRDb25zdHJhaW50cygpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQ29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50PiBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9iamVjdCkgew0KLQkJCQlyZXR1cm4gc2VpUHJvdmlkZXIuZ2V0Q29uc3RyYWludHMoKTsNCi0JCQl9CQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uPElNb2RlbENvbnN0cmFpbnQ+IGNhc2VJV2ViTWV0aG9kKElXZWJNZXRob2Qgb2JqZWN0KSB7DQotCQkJCXJldHVybiB3bVByb3ZpZGVyLmdldENvbnN0cmFpbnRzKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uPElNb2RlbENvbnN0cmFpbnQ+IGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIG9iamVjdCkgew0KLQkJCQlyZXR1cm4gd3BQcm92aWRlci5nZXRDb25zdHJhaW50cygpOw0KLQkJCX0NCi0JCX07DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL1dzUHJvYmxlbXNSZXBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL1dzUHJvYmxlbXNSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwY2RiMzhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9Xc1Byb2JsZW1zUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklDb25zdHJhaW50U3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLklWYWxpZGF0aW9uTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuVmFsaWRhdGlvbkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiBQcm9ibGVtcyByZXBvcnRlci4gTGlzdGVucyB0byB2YWxpZGF0aW9uIGV2ZW50cyBhbmQgcmVwb3J0cyBlcnJvcnMuICANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzUHJvYmxlbXNSZXBvcnRlciBpbXBsZW1lbnRzIElWYWxpZGF0aW9uTGlzdGVuZXIgDQotew0KLQkvKiogVGhlIHZhbGlkYXRpb24gbWFya2VyIElEICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCA9IERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEOw0KLQ0KLQkNCi0JcHVibGljIHZvaWQgdmFsaWRhdGlvbk9jY3VycmVkKFZhbGlkYXRpb25FdmVudCBldmVudCkgDQotCXsNCi0JCWZpbmFsIExpc3Q8SUNvbnN0cmFpbnRTdGF0dXM+IGxpc3QgPSBldmVudC5nZXRWYWxpZGF0aW9uUmVzdWx0cygpOw0KLQkJZm9yIChJQ29uc3RyYWludFN0YXR1cyBjU3RhdHVzIDogbGlzdCkNCi0JCXsNCi0JCQlhc3NlcnQgY1N0YXR1cyBpbnN0YW5jZW9mIElDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQ7DQotCQkJDQotCQkJaWYgKGNTdGF0dXMuaXNPSygpKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0NCi0JCQlwcm9jZXNzU3RhdHVzKGNTdGF0dXMpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1N0YXR1cyhmaW5hbCBJQ29uc3RyYWludFN0YXR1cyBzdGF0dXMpDQotCXsJCQ0KLQkJaWYgKCEoc3RhdHVzIGluc3RhbmNlb2YgSUNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIElQcm9ibGVtTG9jYXRpb24gbG9jYXRvciA9ICgoSUNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZClzdGF0dXMpLmdldFByb2JsZW1Mb2NhdGlvbnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQlmaW5hbCBJTWFya2VyIG1hcmtlciA9IGxvY2F0b3IuZ2V0UmVzb3VyY2UoKS5jcmVhdGVNYXJrZXIoTUFSS0VSX0lEKTsNCi0JCQlpZiAobG9jYXRvci5nZXRMb2NhdG9yKCkgIT0gbnVsbCkgDQotCQkJew0KLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgbG9jYXRvci5nZXRMb2NhdG9yKCkuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCBsb2NhdG9yLmdldExvY2F0b3IoKS5nZXRTdGFydFBvc2l0aW9uKCkgKyBsb2NhdG9yLmdldExvY2F0b3IoKS5nZXRMZW5ndGgoKSk7DQotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgbG9jYXRvci5nZXRMb2NhdG9yKCkuZ2V0TGluZU51bWJlcigpKTsNCi0JCQl9DQotCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5QUklPUklUWSwgSU1hcmtlci5QUklPUklUWV9OT1JNQUwpOw0KLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgZ2V0TWFya2VyU2V2ZXJpdHkoc3RhdHVzLmdldFNldmVyaXR5KCkpKTsNCi0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU09VUkNFX0lELCBzdGF0dXMuZ2V0Q29uc3RyYWludCgpLmdldERlc2NyaXB0b3IoKS5nZXRJZCgpKTsNCi0JCQltYXJrZXIuc2V0QXR0cmlidXRlKERvbVZhbGlkYXRpb25Db25zdGFudHMuSU1QTEVNRU5UQVRJT04sIERvbVV0aWwuSU5TVEFOQ0UuY2FsY1VuaXF1ZUltcGwoc3RhdHVzLmdldFRhcmdldCgpKSk7DQotCQl9IA0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBpbnQgZ2V0TWFya2VyU2V2ZXJpdHkoaW50IHN0YXR1c1NldmVyaXR5KQ0KLQl7DQotCQlzd2l0Y2goc3RhdHVzU2V2ZXJpdHkpDQotCQl7DQotCQljYXNlIElTdGF0dXMuSU5GTzogcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfSU5GTzsNCi0JCWNhc2UgSVN0YXR1cy5XQVJOSU5HOiByZXR1cm4gSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOw0KLQkJZGVmYXVsdDoNCi0JCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9FUlJPUjsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyKCkgew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vaW1wbC9Db25zdHJhaW50U3RhdHVzRXh0ZW5kZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9pbXBsL0NvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDFlYTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9pbXBsL0NvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuQ29uc3RyYWludFN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuSU1vZGVsQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSUNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSVByb2JsZW1Mb2NhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi0NCi0vKioNCi0gKiBFeHRlbmRlZCBjb25zdHJhaW50IHN0YXR1cyB3aGljaCBjYXJyaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ibGVtIGxvY2F0aW9uIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGNsYXNzIENvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCBleHRlbmRzIENvbnN0cmFpbnRTdGF0dXMgaW1wbGVtZW50cyBJQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkDQotew0KLQlwcml2YXRlIGZpbmFsIFNldDxJUHJvYmxlbUxvY2F0aW9uPiBwcm9ibGVtTG9jYXRpb25zOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBhIDxjb2RlPkNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZDwvY29kZT4gaW5zdGFuY2Ugd2l0aCBlbXB0eSByZXN1bHQgbG9jdXMNCi0JICogQHBhcmFtIGNvbnN0cmFpbnQNCi0JICogQHBhcmFtIHRhcmdldA0KLQkgKiBAcGFyYW0gc2V2ZXJpdHkNCi0JICogQHBhcmFtIGNvZGUNCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogQHBhcmFtIHByb2JsZW1Mb2NhdGlvbnMgYSBzZXQgb2YgcHJvYmxlbSBsb2NhdGlvbnMgb3IgZW1wdHkgc2V0IGlmIG5vbmU7IGNhbm5vdCBiZSBudWxsLjxicj4gDQotCSAqIA0KLQkgKiBAc2VlIENvbnN0cmFpbnRTdGF0dXMjQ29uc3RyYWludFN0YXR1cyhJTW9kZWxDb25zdHJhaW50LCBFT2JqZWN0LCBpbnQsIGludCwgU3RyaW5nLCBTZXQpDQotCSAqLw0KLQlwdWJsaWMgQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkKGZpbmFsIElNb2RlbENvbnN0cmFpbnQgY29uc3RyYWludCwgZmluYWwgRU9iamVjdCB0YXJnZXQsIGZpbmFsIGludCBzZXZlcml0eSwgZmluYWwgaW50IGNvZGUsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBTZXQ8SVByb2JsZW1Mb2NhdGlvbj4gcHJvYmxlbUxvY2F0aW9ucykNCi0Jew0KLQkJc3VwZXIoY29uc3RyYWludCwgdGFyZ2V0LCBzZXZlcml0eSwgY29kZSwgbWVzc2FnZSwgbmV3IEhhc2hTZXQ8RU9iamVjdD4oKSk7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0ocHJvYmxlbUxvY2F0aW9ucywgInByb2JsZW1Mb2NhdGlvbiIpOy8vJE5PTi1OTFMtMSQNCi0JCXRoaXMucHJvYmxlbUxvY2F0aW9ucyA9IHByb2JsZW1Mb2NhdGlvbnM7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+Q29uc3RyYWludFN0YXR1c0V4dGVuZGVkPC9jb2RlPiBpbnN0YW5jZSB3aXRoIGVtcHR5IHJlc3VsdCBsb2N1cw0KLQkgKiBAcGFyYW0gY29uc3RyYWludA0KLQkgKiBAcGFyYW0gdGFyZ2V0DQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqIEBwYXJhbSBwcm9ibGVtTG9jYXRpb25zIGEgc2V0IG9mIHByb2JsZW0gbG9jYXRpb25zIG9yIGVtcHR5IHNldCBpZiBub25lOyBjYW5ub3QgYmUgbnVsbC48YnI+IA0KLQkgKiANCi0JICogQHNlZSBDb25zdHJhaW50U3RhdHVzI0NvbnN0cmFpbnRTdGF0dXMoSU1vZGVsQ29uc3RyYWludCwgRU9iamVjdCwgU3RyaW5nLCBTZXQpDQotCSAqLw0KLQlwdWJsaWMgQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkKGZpbmFsIElNb2RlbENvbnN0cmFpbnQgY29uc3RyYWludCwgZmluYWwgRU9iamVjdCB0YXJnZXQsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBTZXQ8SVByb2JsZW1Mb2NhdGlvbj4gcHJvYmxlbUxvY2F0aW9ucykNCi0Jew0KLQkJc3VwZXIoY29uc3RyYWludCwgdGFyZ2V0LCBtZXNzYWdlLCBuZXcgSGFzaFNldDxFT2JqZWN0PigpKTsNCi0JCXRoaXMucHJvYmxlbUxvY2F0aW9ucyA9IHByb2JsZW1Mb2NhdGlvbnM7DQotCX0NCi0JDQotCXB1YmxpYyBTZXQ8SVByb2JsZW1Mb2NhdGlvbj4gZ2V0UHJvYmxlbUxvY2F0aW9ucygpDQotCXsNCi0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQodGhpcy5wcm9ibGVtTG9jYXRpb25zKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vaW1wbC9Qcm9ibGVtTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9pbXBsL1Byb2JsZW1Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTU0Nzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9pbXBsL1Byb2JsZW1Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5JUHJvYmxlbUxvY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotDQotDQotcHVibGljIGNsYXNzIFByb2JsZW1Mb2NhdGlvbiBpbXBsZW1lbnRzIElQcm9ibGVtTG9jYXRpb24gDQotew0KLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZTsNCi0JcHJpdmF0ZSBmaW5hbCBJTG9jYXRvciBsb2NhdG9yOw0KLQkNCi0JcHVibGljIFByb2JsZW1Mb2NhdGlvbihJUmVzb3VyY2UgcmVzb3VyY2UsIElMb2NhdG9yIGxvY2F0b3IpIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShyZXNvdXJjZSwgInJlc291cmNlIik7Ly8kTk9OLU5MUy0xJA0KLQkJDQotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7DQotCQl0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUxvY2F0b3IgZ2V0TG9jYXRvcigpIHsNCi0JCXJldHVybiBsb2NhdG9yOw0KLQl9DQotDQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7DQotCQlyZXR1cm4gcmVzb3VyY2U7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9tZXNzYWdlcy9WYWxpZGF0aW9uTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9tZXNzYWdlcy9WYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWI0YzFhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vbWVzc2FnZXMvVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOw0KLQ0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTWVzc2FnZXMgZXh0ZW5kcyBOTFMNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvdHRvbVVwUHJvdmlkZXJHZW5lcmF0b3JfRmFpbGVkdG9Bbm5vdGF0ZTsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm90dG9tVXBQcm92aWRlckdlbmVyYXRvcl9GYWlsZWRUb0NvbGxlY3RNZXRob2RzOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb3R0b21VcFByb3ZpZGVyR2VuZXJhdG9yX01ldGhvZE5vdFN1cHBvcnRlZDsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm90dG9tVXBQcm92aWRlckdlbmVyYXRvcl9Qcm9qZWN0Tm90QWNjZXNpYmxlOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFamIzVG9wRG93blByb3ZpZGVyR2VuZXJhdG9yX0luY29uc2lzdGVudE1ldGFkYXRhOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFamIzVG9wRG93blByb3ZpZGVyR2VuZXJhdG9yX0ludGVybmFsRXJyb3JJbnRlcmZhY2U7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVqYjNUb3BEb3duUHJvdmlkZXJHZW5lcmF0b3JfSW50ZXJuYWxFcnJvck9wZXJhdGlvbjsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWpiM1RvcERvd25Qcm92aWRlckdlbmVyYXRvcl9JbnZhbGlkSW50ZXJmYWNlTWFwcGluZzsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWpiM1RvcERvd25Qcm92aWRlckdlbmVyYXRvcl9NYXBwaW5nc0VtcHR5Ow0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm94eVdvcmthcm91bmRfVW5hYmxlVG9EZWxldGVQcm94eTsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJveHlXb3JrYXJvdW5kX1VuYWJsZVRvUmVuYW1lUHJveHk7DQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXc2RsMkphdmFHZW5lcmF0b3JfRXJyb3JEdXJpbmdHZW5lcmF0aW9uOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXc2RsMkphdmFHZW5lcmF0b3JfSW5jb3JyZWN0VVJMOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXc2RsMkphdmFHZW5lcmF0b3JfUGF0aEluYXBwcm9wcmlhdGU7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdzZGwySmF2YUdlbmVyYXRvcl9XU0RMRG93bmxvYWRFeGNlcHRpb247DQotDQotCS8qKiBNZXNzYWdlIGZvciBub3QgZXhpc3RpbmcgU0VJICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdzVmFsaWRhdGlvbl9TZWlEb2VzTm90RXhpc3RzOw0KLQ0KLQkvKiogTWVzc2FnZSBmb3Igbm9uIGV4aXN0aW5nIFdTREwgcmVmZXJlbmNlZCBieSB3c2RsTG9jYXRpb24gKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV3NWYWxpZGF0aW9uX1dzZGxEb2VzTm90RXhpc3RzOw0KLQkNCi0JLyoqIE9uIFNFSSBwb3J0TmFtZSwgc2VydmljZU5hbWUgYW5kIGVuZHBvaW50SW50ZXJmYWNlIHNob3VsZCBub3QgYmUgdXNlZCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWlWYWxpZGF0aW9uX1JlZHVuZGFudEF0dHJpYnV0ZXM7DQotCQ0KLQkvKiogTWVzc2FnZSBmb3IgYWxyZWFkeSBleGlzdGluZyBtZXRob2QgbmFtZSBpbiBTRUkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViTWV0aG9kVmFsaWRhdGlvbl9OYW1lRXhpc3RzOw0KLQ0KLQkvKiogTWVzc2FnZSBmb3IgZXhjbHVkZWQgbWV0aG9kcyBpbnNpZGUgU0VJICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYk1ldGhvZFZhbGlkYXRpb25fTWV0aG9kU2hvdWxkTm90QmVFeGNsdWRlZDsJDQotCQ0KLQkvKiogRXhjbHVkZWQgbWV0aG9kIHNob3VsZCBjb250YWluIG9ubHkgZXhjbHVkZSBhdHRyaWJ1dGUgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViTWV0aG9kVmFsaWRhdGlvbl9FeGNsdWRlZEhhc090aGVyQXR0cmlidXRlczsNCi0JDQotCS8qKiBNZXNzYWdlIGZvciB1c2VkICduYW1lJyBhdHRyaWJ1dGUgd2hpbGUgU0VJIGlzIHJlZmVyZW5jZWQgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV3NWYWxpZGF0aW9uX05hbWVTaG91bGROb3RCZVVzZWRXaXRoU2VpOw0KLQkNCi0JLyoqIE1lc3NhZ2UgZm9yIGR1cGxpY2F0ZWQgd2ViIHBhcmFtZXRlciBuYW1lICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYlBhcmFtVmFsaWRhdGlvbl9OYW1lRXhpc3RzOw0KLQkNCi0JLyoqIEF0dHJpYnV0ZSAnbmFtZScgaXMgbm90IG5lZWRlZCBkdWUgdG8gY3VycmVudCBTT0FQQmluZGluZyBjb25maWd1cmF0aW9uICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYlBhcmFtVmFsaWRhdGlvbl9OYW1lUmVkdW5kYW50Ow0KLQkNCi0JLyoqIEF0dHJpYnV0ZSAnbmFtZScgaXMgcmVxdWlyZWQgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViUGFyYW1WYWxpZGF0aW9uX05hbWVSZXF1aXJlZDsNCi0JDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdzVmFsaWRhdGlvbl9Xc0Fubm90YXRpb25Pbk5vblNlc3Npb25CZWFuX0Vycm9yOw0KLQkNCi0NCi0Jc3RhdGljDQotCXsNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFZhbGlkYXRpb25NZXNzYWdlcy5jbGFzcyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL21lc3NhZ2VzL1ZhbGlkYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL21lc3NhZ2VzL1ZhbGlkYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzc4M2EwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9tZXNzYWdlcy9WYWxpZGF0aW9uTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1Cb3R0b21VcFByb3ZpZGVyR2VuZXJhdG9yX0ZhaWxlZHRvQW5ub3RhdGU9RmFpbGVkIHRvIGFubm90YXRlIGNsYXNzDQotQm90dG9tVXBQcm92aWRlckdlbmVyYXRvcl9GYWlsZWRUb0NvbGxlY3RNZXRob2RzPUZhaWxlZCB0byBjb2xsZWN0IHN1cHBvcnRlZCBtZXRob2RzDQotQm90dG9tVXBQcm92aWRlckdlbmVyYXRvcl9NZXRob2ROb3RTdXBwb3J0ZWQ9TWV0aG9kIHswfSBpcyBub3QgaW4gdGhlIHN1cHBvcnRlZC4gV2ViIFNlcnZpY2UgYW5ub3RhdGlvbnMgY291bGQgbm90IGJlIGFkZGVkIHRvIGVuZHBvaW50DQotQm90dG9tVXBQcm92aWRlckdlbmVyYXRvcl9Qcm9qZWN0Tm90QWNjZXNpYmxlPVRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIElUeXBlIHByb3ZpZGVkIHNob3VsZCBiZSBhY2Nlc3NpYmxlDQotRWpiM1RvcERvd25Qcm92aWRlckdlbmVyYXRvcl9JbmNvbnNpc3RlbnRNZXRhZGF0YT1HZW5lcmF0ZWQgSVByb3ZpZGVyTWV0YWRhdGEgc2hvdWxkIGNvbnRhaW5zIElFbmRwb2luTWV0YWRhDQotRWpiM1RvcERvd25Qcm92aWRlckdlbmVyYXRvcl9JbnRlcm5hbEVycm9ySW50ZXJmYWNlPUludGVybmFsIGVycm9yLCBjb3VsZCBub3QgZmluZCByZWxhdGlvbiBiZXR3ZWVuIEludGVyZmFjZU1hcHBpbmc6IHswfSBhbmQgQ29uZmlndXJhdGlvbiBlbnRpdGllcw0KLUVqYjNUb3BEb3duUHJvdmlkZXJHZW5lcmF0b3JfSW50ZXJuYWxFcnJvck9wZXJhdGlvbj1JbnRlcm5hbCBlcnJvciwgY291bGQgbm90IGZpbmQgcmVsYXRpb24gYmV0d2VlbiBPcGVyYXRpb25NYXBwaW5nOiB7MH0gYW5kIENvbmZpZ3VyYXRpb24gZW50aXRpZXMgaW5zaWRlIEludGVyZmFjZURhdGE6IHsxfQ0KLUVqYjNUb3BEb3duUHJvdmlkZXJHZW5lcmF0b3JfSW52YWxpZEludGVyZmFjZU1hcHBpbmc9UmV0dXJuZWQgaW50ZXJmYWNlIG1hcHBpbmdzIGNvdWxkIG5vdCBiZSBudWxsIG9yIGVtcHR5IGFycmF5DQotRWpiM1RvcERvd25Qcm92aWRlckdlbmVyYXRvcl9NYXBwaW5nc0VtcHR5PVJldHVybmVkIG9wcGVyYXRpb24gbWFwcGluZ3MgZm9yIGludGVyZmFjZSBtYXBwaW5nIHswfSBjb3VsZCBub3QgYmUgbnVsbCBvciBlbXB0eSBhcnJheQ0KLVByb3h5V29ya2Fyb3VuZF9VbmFibGVUb0RlbGV0ZVByb3h5PVVuYWJsZSB0byBkZWxldGUgb3JpZ2luYWwgcHJveHkgc291cmNlIGZpbGU6IHswfQ0KLVByb3h5V29ya2Fyb3VuZF9VbmFibGVUb1JlbmFtZVByb3h5PVVuYWJsZSB0byByZW5hbWUgcGF0Y2hlZCBwcm94eSBzb3VyY2UgZmlsZSB0byBpdHMgb3JpZ2luYWwgbmFtZTogezB9DQotDQotV3NkbDJKYXZhR2VuZXJhdG9yX0Vycm9yRHVyaW5nR2VuZXJhdGlvbj1FcnJvciBkdXJpbmcgV1NETCB0byBKYXZhIGdlbmVyYXRpb24gDQotV3NkbDJKYXZhR2VuZXJhdG9yX0luY29ycmVjdFVSTD1JbmNvcnJlY3QgV1NETCBVUkwgc3ludGF4DQotV3NkbDJKYXZhR2VuZXJhdG9yX1BhdGhJbmFwcHJvcHJpYXRlPVBhdGggb2YgdGhlIGZpbGUgezB9IGlzbid0IGFwcHJvcHJpYXRlIHRvIGJ1aWxkIGFuIFVSTA0KLVdzZGwySmF2YUdlbmVyYXRvcl9XU0RMRG93bmxvYWRFeGNlcHRpb249RXhjZXB0aW9uIG9jdXJlZCBkdXJpbmcgV1NETCBkb3dubG9hZA0KLVdzVmFsaWRhdGlvbl9TZWlEb2VzTm90RXhpc3RzID0gVGhlIHNwZWNpZmllZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSB7MH0gZG9lcyBub3QgZXhpc3RzIG9yIG5vdCBhbm5vdGF0ZWQgY29ycmVjdGx5DQotV3NWYWxpZGF0aW9uX1dzZGxEb2VzTm90RXhpc3RzID0gVGhlIHNwZWNpZmllZCBXU0RMIGlzIGluY29ycmVjdCwgVVJMIHBhcnNpbmcgZXJyb3I6IHswfQ0KLVdzVmFsaWRhdGlvbl9OYW1lU2hvdWxkTm90QmVVc2VkV2l0aFNlaSA9IE5hbWUgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCBpZiBTRUkgaXMgcmVmZXJlbmNlZCB2aWEgZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlDQotV3NWYWxpZGF0aW9uX1dzQW5ub3RhdGlvbk9uTm9uU2Vzc2lvbkJlYW5fRXJyb3IgPSBAV2ViU2VydmljZSBhbm5vdGF0aW9uIGluIEVKQiBtb2R1bGVzIGNhbiBiZSBvbmx5IHVzZWQgb24gc2Vzc2lvbiBiZWFucw0KLQ0KLVNlaVZhbGlkYXRpb25fUmVkdW5kYW50QXR0cmlidXRlcyA9IEBXZWJTZXJ2aWNlIGFubm90YXRpb24gc2hvdWxkIG5vdCBpbmNsdWRlIGF0dHJpYnV0ZXMgcG9ydE5hbWUsIHNlcnZpY2VOYW1lLCBlbmRwb2ludEludGVyZmFjZSBhbmQgd3NkbExvY2F0aW9uIHdoZW4gdXNlZCBvbiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSANCi0NCi1XZWJNZXRob2RWYWxpZGF0aW9uX05hbWVFeGlzdHMJPSBXZWIgbWV0aG9kIHdpdGggbmFtZSB7MH0gYWxyZWFkeSBleGlzdHMNCi1XZWJNZXRob2RWYWxpZGF0aW9uX01ldGhvZFNob3VsZE5vdEJlRXhjbHVkZWQgPSBTZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBtZXRob2RzIGNhbm5vdCBiZSBleGNsdWRlZA0KLVdlYk1ldGhvZFZhbGlkYXRpb25fRXhjbHVkZWRIYXNPdGhlckF0dHJpYnV0ZXMJPSBFeGNsdWRlZCBXZWIgbWV0aG9kIHNob3VsZCBub3QgY29udGFpbiBhdHRyaWJ1dGVzIG90aGVyIHRoYW4gZXhjbHVkZSBhdHRyaWJ1dGUgDQotDQotV2ViUGFyYW1WYWxpZGF0aW9uX05hbWVFeGlzdHMJPSBXZWIgcGFyYW1ldGVyIHdpdGggbmFtZSB7MH0gYWxyZWFkeSBleGlzdHMNCi1XZWJQYXJhbVZhbGlkYXRpb25fTmFtZVJlZHVuZGFudD0gTmFtZSBhdHRyaWJ1dGUgaXMgbm90IHVzZWQgaWYgU09BUEJpbmRpbmcuU3R5bGUgaXMgUlBDIGFuZCBwYXJ0TmFtZSBpcyBwcmVzZW50DQotV2ViUGFyYW1WYWxpZGF0aW9uX05hbWVSZXF1aXJlZCA9IEEgbmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkIGlmIHRoZSBvcGVyYXRpb24gaXMgZG9jdW1lbnQgc3R5bGUsIHRoZSBwYXJhbWV0ZXIgc3R5bGUgaXMgQkFSRSwgYW5kIHRoZSBtb2RlIGlzIE9VVCBvciBJTk9VVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9FbmRwb2ludFR5cGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9FbmRwb2ludFR5cGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmNiYmQ5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvRW5kcG9pbnRUeXBlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnZhbGlkYXRpb24ucHJvdmlkZXIuVHlwZUFkYXB0ZXI7DQotDQotLyoqDQotICogUHJvdmlkZXMgdHlwZSB2YWxpZGF0aW9uIGZvciBjbGFzcyBpbnRlZGVudCB0byBiZSB1c2VkIGFzIGFuIGVuZHBvaW50IGluDQotICogV2ViU2VydmljZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotDQotcHVibGljIGNsYXNzIEVuZHBvaW50VHlwZVZhbGlkYXRvciB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTFlaRV9NRVRIT0RfTkFNRSA9ICJmaW5hbGl6ZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFZhbGlkYXRlcyA8dHQ+dHlwZTwvdHQ+IGlmIGlzIGNhcHBhYmxlIHRvIGJlIHVzZWQgYXMgZW5kcG9pbnQuIFR5cGUgdXNlZA0KLQkgKiBhcyBFbmRwb2ludCBzaG91bGQgZnVsZmlsIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAgMS4gTXVzdCBiZSBhIHNvdXJjZSB0eXBlDQotCSAqICAyLiBNdXN0IGJlIHB1YmxpYw0KLQkgKiAgMy4gU2hvdWxkIG5vdCBiZSBhbiBpbnRlcmZhY2UNCi0JICogIDQuIFNob3VsZCBub3QgYmUgYW4gYWJzdHJhY3QgY2xhc3MNCi0JICogIDUuIFNob3VsZCBub3QgYmUgZmluYWwNCi0JICogIDYuIFNob3VsZCBwcm92aWRlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JICogIDcuIFNob3VsZCBub3QgZGVjbGFyZSBmaW5hbHl6ZSgpIG1ldGhvZA0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEByZXR1cm4gSVN0YXR1cyBvYmplY3QgLSBpbiBjYXNlIDx0dD50eXBlPC90dD4gY2FuIGJlIHVzZWQgYXMgZW5kcG9pbnQNCi0JICogICAgICAgICB0aGUge0BsaW5rIElTdGF0dXMjZ2V0U2V2ZXJpdHkoKX0gd2lsbCByZXR1cm4ge0BsaW5rIElTdGF0dXMjT0t9LA0KLQkgKiAgICAgICAgIGVsc2Uge0BsaW5rIElTdGF0dXMjRVJST1J9IGlzIHJldHVybmVkIGFuZA0KLQkgKiAgICAgICAgIHtAbGluayBJU3RhdHVzI2dldE1lc3NhZ2UoKX0gd2lsbCByZXR1cm4gcmVhZGFibGUgbWVzc2FnZQ0KLQkgKiAgICAgICAgIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiB0aGF0IGlzIG5vdCBmdWxmaWxlZC4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJVHlwZUFkYXB0ZXIgdHlwZUFkYXB0ZXIgPSBuZXcgVHlwZUFkYXB0ZXIodHlwZSk7DQotCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlQWRhcHRlci5nZXRRdWFsaWZpZWROYW1lKCk7DQotDQotCQlpZiAodHlwZS5pc0JpbmFyeSgpKSB7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoDQotCQkJCQlNZXNzYWdlRm9ybWF0DQotCQkJCQkJCS5mb3JtYXQoDQotCQkJCQkJCQkJSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQklOQVJZQ0xBU1MsDQotCQkJCQkJCQkJdHlwZU5hbWUpLA0KLQkJCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCQkJTWVzc2FnZUZvcm1hdA0KLQkJCQkJCQkJCS5mb3JtYXQoDQotCQkJCQkJCQkJCQkiQ2xhc3MgezB9IGlzIGJpbmFyeSBjbGFzcyBhbmQgY2Fubm90IGJlIGFubm90YXRlZCIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCXR5cGVOYW1lKSkpOw0KLQkJfQ0KLQ0KLQkJaWYgKCF0eXBlQWRhcHRlci5pc1B1YmxpYygpKSB7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdA0KLQkJCQkJLmZvcm1hdCgNCi0JCQkJCQkJSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfTk9UUFVCTElDLA0KLQkJCQkJCQl0eXBlTmFtZSksDQotCQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJCQlNZXNzYWdlRm9ybWF0DQotCQkJCQkJCQkJLmZvcm1hdCgNCi0JCQkJCQkJCQkJCSJDbGFzcyB7MH0gaXMgbm90IHB1YmxpYyBhbmQgY2Fubm90IGJlIHVzZWQgYXMgd2ViIHNlcnZpY2UgZW5kcG9pbnQiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQl0eXBlTmFtZSkpKTsNCi0JCX0NCi0NCi0JCWlmICghdHlwZUFkYXB0ZXIuZ2V0VHlwZSgpLmlzQ2xhc3MoKSkgew0KLQkJCXJldHVybiBwcmVwYXJlU3RhdHVzKE1lc3NhZ2VGb3JtYXQNCi0JCQkJCS5mb3JtYXQoDQotCQkJCQkJCUpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkVuZHBvaW50VHlwZVZhbGlkYXRvcl9FUlJfTVNHX05PVENMQVNTLA0KLQkJCQkJCQl0eXBlTmFtZSksDQotCQkJCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQotCQkJCQkJCQkJTWVzc2FnZUZvcm1hdA0KLQkJCQkJCQkJCQkJLmZvcm1hdCgNCi0JCQkJCQkJCQkJCQkJInswfSBpcyBub3QgYSBjbGFzcyIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCQkJdHlwZU5hbWUpKSk7DQotCQl9DQotDQotCQlpZiAodHlwZUFkYXB0ZXIuaXNBYnN0cmFjdCgpKSB7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdA0KLQkJCQkJLmZvcm1hdCgNCi0JCQkJCQkJSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQUJTVFJBQ1QsDQotCQkJCQkJCXR5cGVOYW1lKSwNCi0JCQkJCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCQkJCQlNZXNzYWdlRm9ybWF0DQotCQkJCQkJCQkJCQkuZm9ybWF0KA0KLQkJCQkJCQkJCQkJCQkiQ2xhc3MgezB9IGlzIGFic3RyYWN0IiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJCQl0eXBlTmFtZSkpKTsNCi0JCX0NCi0NCi0JCWlmICh0eXBlQWRhcHRlci5pc0ZpbmFsKCkpIHsNCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhNZXNzYWdlRm9ybWF0DQotCQkJCQkuZm9ybWF0KA0KLQkJCQkJCQlKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5FbmRwb2ludFR5cGVWYWxpZGF0b3JfRVJSX01TR19GSU5BTCwNCi0JCQkJCQkJdHlwZU5hbWUpLA0KLQkJCQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQNCi0JCQkJCQkJCQkJCS5mb3JtYXQoDQotCQkJCQkJCQkJCQkJCSJDbGFzcyB7MH0gaXMgZmluYWwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHdlYiBzZXJ2aWNlIGVuZHBvaW50IiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJCQl0eXBlTmFtZSkpKTsNCi0JCX0NCi0NCi0JCWlmICghdHlwZUFkYXB0ZXIuaGFzRGVmYXVsdENvbnN0cnVjdG9yKCkpIHsNCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhNZXNzYWdlRm9ybWF0DQotCQkJCQkuZm9ybWF0KA0KLQkJCQkJCQlKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5FbmRwb2ludFR5cGVWYWxpZGF0b3JfRVJSX01TR19DT05TVFJVQ1RPUiwNCi0JCQkJCQkJdHlwZU5hbWUpLA0KLQkJCQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQNCi0JCQkJCQkJCQkJCS5mb3JtYXQoDQotCQkJCQkJCQkJCQkJCSJDbGFzcyB7MH0gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQkJCXR5cGVOYW1lKSkpOw0KLQkJfQ0KLQ0KLQkJaWYgKGhhc0ZpbmFseXplTWV0aG9kKHR5cGUpKSB7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdA0KLQkJCQkJLmZvcm1hdCgNCi0JCQkJCQkJSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfSEFTRklOQUxZWkUsDQotCQkJCQkJCXR5cGVOYW1lKSwNCi0JCQkJCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCQkJCQlNZXNzYWdlRm9ybWF0DQotCQkJCQkJCQkJCQkuZm9ybWF0KA0KLQkJCQkJCQkJCQkJCQkiQ2xhc3MgezB9IGNvbnRhaW5zIGZpbmFsaXplKCkgbWV0aG9kIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyB3ZWIgc2VydmljZSBlbmRwb2ludCIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCQkJdHlwZU5hbWUpKSk7DQotCQl9DQotDQotCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhudWxsLCBudWxsKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHR5cGUgY29udGFpbnMgZmluYWx5emUoKSBtZXRob2QNCi0JICogDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiBoYXMgZmluYWx5emUgbWV0aG9kDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaGFzRmluYWx5emVNZXRob2QoSVR5cGUgdHlwZSkgew0KLQkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZChGSU5BTFlaRV9NRVRIT0RfTkFNRSwgbmV3IFN0cmluZ1swXSk7DQotCQlpZiAobWV0aG9kID09IG51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAobWV0aG9kLmV4aXN0cygpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByZXBhcmVzIElTdGF0dXMgaW5zdGFuY2UuIElmIDxjb2RlPmVycm9yTWVzc2FnZTwvY29kZT4gaXMNCi0JICogPGNvZGU+bnVsbDwvY29kZT4gSVN0YXR1cy5PSyBpcyBzZXQgdG8gdGhlIElTdGF0dXMgb2JqZWN0IGVsc2UgdGhlIHN0YXR1cw0KLQkgKiBpcyBJU3RhdHVzLkVSUk9SLg0KLQkgKiANCi0JICogQHBhcmFtIGVycm9yTWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGJlIHVzZWQNCi0JICogQHJldHVybiBhbHdheXMgcmV0dXJucyBhbiB2YWxpZCBJTWV0aG9kQXVkaXQgaW5zdGFuY2UuDQotCSAqLw0KLQlwcml2YXRlIElTdGF0dXMgcHJlcGFyZVN0YXR1cyhTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwaW9uKSB7DQotCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoKGxvY2FsaXplZE1lc3NhZ2UgPT0gbnVsbCkgPyBJU3RhdHVzLk9LDQotCQkJCTogSVN0YXR1cy5FUlJPUiwgSmF4V3NEb21SdW50aW1lUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywNCi0JCQkJKGxvY2FsaXplZE1lc3NhZ2UgPT0gbnVsbCkgPyBFTVBUWSA6IGxvY2FsaXplZE1lc3NhZ2UsIGV4Y2VwaW9uKTsNCi0NCi0JCXJldHVybiBzdGF0dXM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL01ldGhvZFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL01ldGhvZFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYzlkNDA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9NZXRob2RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5QcmltaXRpdmVUeXBlSGFuZGxlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLlR5cGVSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC52YWxpZGF0aW9uLnByb3ZpZGVyLlR5cGVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkNvbnN0cnVjdG9yTm90RXhwb3NhYmxlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuTWV0aG9kTm90UHVibGljRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFBlcmZvcm1lcyBtZXRob2QgdmFsaWRhdGlvbiBieSB2YWxpZGF0aW5nIHR5cGVzIHVzZWQuIFR5cGVzIGFyZSBjYWNoZWQgYmV0d2VlbiBkaWZmZXJlbnQgaW52b2NhdGlvbnMgb2YgY2hlY2soSU1ldGhvZCBtZXRob2QpIGZvciBiZXR0ZXINCi0gKiBwZXJmb3JtYW5jZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFZhbGlkYXRvcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVNUFRZID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBmaW5hbCBSdW50aW1lVHlwZVZhbGlkYXRvciB2YWxpZGF0b3I7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvci4NCi0JICovDQotCXB1YmxpYyBNZXRob2RWYWxpZGF0b3IoKQ0KLQl7DQotCQl2YWxpZGF0b3IgPSBuZXcgUnVudGltZVR5cGVWYWxpZGF0b3IoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUGVyZm9ybXMgY2hlY2sgb24gdHlwZXMgdXNlZCBpbiBtZXRob2QuIENoZWNrcyByZXR1cm4gdHlwZXMsIHBhcmFtZXRoZXIgdHlwZXMgYW5kIGV4Y2VwdGlvbiB0eXBlcy4gU3RvcHMgdmFsaWRhdGlvbiBvbiB0aGUgZmlyc3QgZXJyb3IuIEFuDQotCSAqIElTdGF0dXMgb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gb24gdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2sgaXMgcmV0dXJuZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWV0aG9kDQotCSAqIEByZXR1cm4gSVN0YXR1cyB3aXRoIHNldmVyaXR5IElTdGF0dXMuT0sgaWYgdGhlIG1ldGhvZCBjYW4gYmUgZXhwb3NlZCwgb3IgSVN0YXR1cy5FUlJPUiBpbmNsdWRpbmcgZXJyb3IgbWVzc2FnZSBkZWNyaWJpbmcgdGhlIHByb2JsZW0uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gLQ0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIDxjb2RlPm1ldGhvZDwvY29kZT4gaXMgbnVsbA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgY2hlY2soSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpCXsNCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhuZXcgQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb24obWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgZGVjbGFyaW5nVHlwZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotDQotCQlpZiAoIUZsYWdzLmlzUHVibGljKG1ldGhvZC5nZXRGbGFncygpKSAmJiAhZGVjbGFyaW5nVHlwZS5pc0ludGVyZmFjZSgpKQl7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMobmV3IE1ldGhvZE5vdFB1YmxpY0V4Y2VwdGlvbihtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSkpOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJLy8gSGFuZGxlIHJldHVybiB0eXBlDQotCQkJdmFsaWRhdGVSdW50aW1lQ2xhc3MobWV0aG9kLmdldFJldHVyblR5cGUoKSwgZGVjbGFyaW5nVHlwZSk7DQotDQotCQkJLy8gSGFuZGxlIGlucHV0IHBhcmFtZXRlcnMgYW5kIHRoZXJlIHR5cGVzDQotCQkJZm9yIChTdHJpbmcgcGFyYW1UeXBlTmFtZSA6IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKQ0KLQkJCXsNCi0JCQkJdmFsaWRhdGVSdW50aW1lQ2xhc3MocGFyYW1UeXBlTmFtZSwgZGVjbGFyaW5nVHlwZSk7DQotCQkJfQ0KLQ0KLQkJCS8vIGhhbmRsZSBleGNlcHRpb24gdHlwZXMNCi0JCQlmb3IgKFN0cmluZyBleGNlcHRpb25UeXBlTmFtZSA6IG1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpKQ0KLQkJCXsNCi0JCQkJdmFsaWRhdGVFeGNlcHRpb24oZXhjZXB0aW9uVHlwZU5hbWUsIGRlY2xhcmluZ1R5cGUpOw0KLQkJCX0NCi0NCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhudWxsKTsNCi0JCX0gY2F0Y2ggKEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVmFsaWRhdGVzIDxjb2RlPnR5cGVOYW1lPC9jb2RlPi4gT24gZmlyc3Qgc3RlcHMgdHlwZSBpcyByZXNvbHZlZCBhbmQgYWxsIHJlc29sdmVkIHR5cGVzIGFyZSB2YWxpZGF0ZWQgb25lIGJ5IG9uZS4gVGhlIHJlc29sdmVkIHR5cGVzIGNhbiBiZQ0KLQkgKiBtb3JlIHRoYW4gb25lIGluIGNhc2UgdGhlIHR5cGUgZGVjbGFyYXRpb24gdXNlcyBnZW5lcmljcy4gVmFsaWRhdGlvbiBwcm9wYWdhdGVzIHRoZSBleGNlcHRpb25zIHRocm93biBieSBSdW50aW1lVHlwZVZhbGlkYXRvci4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcGFyYW0gZGVjbGFyaW5nVHlwZQ0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVJ1bnRpbWVDbGFzcyhTdHJpbmcgdHlwZU5hbWUsIElUeXBlIGRlY2xhcmluZ1R5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0Jew0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzID0gVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlcyh0eXBlTmFtZSwgZGVjbGFyaW5nVHlwZSk7DQotCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpDQotCQl7DQotCQkJaWYgKFByaW1pdGl2ZVR5cGVIYW5kbGVyLmlzVm9pZFR5cGUobmFtZSkpDQotCQkJew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotDQotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKFR5cGVGYWN0b3J5LmNyZWF0ZShuYW1lLCBkZWNsYXJpbmdUeXBlKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFZhbGlkYXRlcyBpZiA8dHQ+ZXhjZXB0aW9uVHlwZTwvdHQ+IGlzIGEgdmFsaWQgZXhjZXB0aW9uIHR5cGUgZm9yIFdTIG9wZXJhdGlvbg0KLQkgKiANCi0JICogQHBhcmFtIGV4Y2VwdGlvblR5cGUgLQ0KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0eXBlIG5hbWUNCi0JICogQHBhcmFtIGRlY2xhcmluZ1R5cGUgLQ0KLQkgKiAgICAgICAgICAgIHR5cGUgaW4gd2hpY2ggaXQgaXMgdXNlZA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZXhjZXB0aW9uVHlwZSwgZmluYWwgSVR5cGUgZGVjbGFyaW5nVHlwZSkgdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgZXhGUU5hbWUgPSBUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGUoU2lnbmF0dXJlLnRvU3RyaW5nKGV4Y2VwdGlvblR5cGUpLCBkZWNsYXJpbmdUeXBlKTsNCi0NCi0JCXZhbGlkYXRvci52YWxpZGF0ZShUeXBlRmFjdG9yeS5jcmVhdGUoZXhGUU5hbWUsIGRlY2xhcmluZ1R5cGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJlcGFyZXMgSU1ldGhvZEF1ZGl0IGluc3RhbmNlIGZvciA8Y29kZT5tZXRob2Q8L2NvZGU+LiBJZiA8Y29kZT50aHJvd2FibGU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IElTdGF0dXMuT0sgaXMgc2V0IHRvIHRoZSBJU3RhdHVzDQotCSAqIG9iamVjdCBjb250YWluZWQgaW4gcmV0dXJuZWQgSU1ldGhvZEF1ZGl0IGluc3RhbmNlIGVsc2UgSVN0YXR1cy5FUlJPUiBpcyBzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gdGhyb3dhYmxlDQotCSAqIEByZXR1cm4gYWx3YXlzIHJldHVybnMgYW4gdmFsaWQgSU1ldGhvZEF1ZGl0IGluc3RhbmNlLg0KLQkgKi8NCi0JcHJpdmF0ZSBJU3RhdHVzIHByZXBhcmVTdGF0dXMoVGhyb3dhYmxlIHRocm93YWJsZSkNCi0Jew0KLQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKCh0aHJvd2FibGUgPT0gbnVsbCkgPyBJU3RhdHVzLk9LIDogSVN0YXR1cy5FUlJPUiwgSmF4V3NEb21SdW50aW1lUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywNCi0JCQkJCQkJCQkJKHRocm93YWJsZSA9PSBudWxsKSA/IEVNUFRZIDogdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKTsNCi0NCi0JCXJldHVybiBzdGF0dXM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL1J1bnRpbWVUeXBlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvUnVudGltZVR5cGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWEzYjg0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvUnVudGltZVR5cGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkdlbmVyYWxUeXBlc05hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5QcmltaXRpdmVUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuVHlwZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC52YWxpZGF0aW9uLnByb3ZpZGVyLlR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC52YWxpZGF0aW9uLnByb3ZpZGVyLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkludGVyZmFjZXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5Ob0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLlR5cGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsKLQotLyoqCi0gKiBQcm92aWRlcyB0eXBlIHZhbGlkYXRpb24gZm9yIGNsYXNzIGludGVkZW50IHRvIGJlIHVzZWQgYXMgYW4gcnVudGltZSBjbGFzc2VzIGluIFdlYlNlcnZpY2UuUnVudGltZSBjbGFzc2VzIHNob3VsZCBmdWxmaWwgZm9sbG93aW5nIHJlcXVpcmVtZW50czo8YnI+Ci0gKiA8dWw+Ci0gKiAxLiBTaG91bGQgcHJvdmlkZSBkZWZhdWx0IGNvbnN0cnVjdG9yPGJyPgotICogMi4gU2hvdWxkIG5vdCBpbXBsZW1lbnQgamF2YS5ybWkuUmVtb3RlPGJyPgotICogMy4gSWYgaXQgaXMgYSBqYXZhLiogdHlwZSBzaG91bGQgYmUgb25lIG9mIGFsbG93ZWQgamF2YSB0eXBlczxicj4KLSAqIDQuIENsYXNzIHNob3VsZCBub3QgY29udGFpbiBpbm5lciBjbGFzc2VzIHRoYXQgYXJlIG5vdCBwdWJsaWMgc3RhdGljLjxicj4KLSAqIDUuIFNob3VsZCBub3QgaGF2ZSAnbXVsdHkgaW5oZXJpdGFuY2UnLiBUaGlzIG1lYW5zIGlmIGNsYXNzIGV4dGVuZHMgY2xhc3Mgb3RoZXIgdGhhbiBqYXZhLmxhbmcuT2JqZWN0IGl0IHNob3VsZCBub3QgaW1wbGVtZW50IGludGVyZmFjZS4gSW4gb3Bvc2l0ZQotICogaWYgdGhlIGNsYXNzIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpdCBzaG91bGQgaW1wbGVtZW50IG9ubHkgb25lIGludGVyZmFjZS4gRm9sbG93aW5nIGludGVyZmFjZXMgYXJlIG5vdCBjaGVja2VkOjxicj4KLSAqIDxicj4KLSAqIAotICogPHVsPgotICogamF2YS5sYW5nLkNvbXBhcmFibGU8YnI+Ci0gKiBqYXZhLmxhbmcuQ2xvbmFibGU8YnI+Ci0gKiBqYXZhLmlvLlNlcmlhbGl6YWJsZQotICogPC91bD4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVUeXBlVmFsaWRhdG9yIGV4dGVuZHMgVHlwZVZhbGlkYXRvcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVFJBTlNJRU5UX0FOTk9UQVRJT04gPSAiamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UUkFOU0lFTlRfQU5OT1RBVElPTl9TSE9SVCA9ICJYbWxUcmFuc2llbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RZUEVfQU5OT1RBVElPTiA9ICJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9GQVVMVF9BTk5PVEFUSU9OID0gImphdmF4LnhtbC53cy5XZWJGYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRVQgPSAiZ2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfRkFDVE9SWSA9ICJPYmplY3RGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVCA9ICJzZXQiOwotCi0JCi0JcHJpdmF0ZSBJQW5ub3RhdGlvbkluc3BlY3RvciBhbm5vdGF0aW9uSW5zcGVjdG9yID0gbnVsbDsKLQotCS8qKgotCSAqIFByb3ZpZGVzIHR5cGUgdmFsaWRhdGlvbiBmb3IgY2xhc3MgaW50ZWRlbnQgdG8gYmUgdXNlZCBhcyBhbiBydW50aW1lIGNsYXNzZXMgaW4gV2ViU2VydmljZS5SdW50aW1lIGNsYXNzZXMgc2hvdWxkIGZ1bGZpbCBmb2xsb3dpbmcKLQkgKiByZXF1aXJlbWVudHM6PGJyPgotCSAqIDx1bD4KLQkgKiAxLiBTaG91bGQgcHJvdmlkZSBkZWZhdWx0IGNvbnN0cnVjdG9yPGJyPgotCSAqIDIuIFNob3VsZCBub3QgaW1wbGVtZW50IGphdmEucm1pLlJlbW90ZTxicj4KLQkgKiAzLiBJZiBpdCBpcyBhIGphdmEuKiB0eXBlIHNob3VsZCBiZSBvbmUgb2YgYWxsb3dlZCBqYXZhIHR5cGVzPGJyPgotCSAqIDQuIENsYXNzIHNob3VsZCBub3QgY29udGFpbiBpbm5lciBjbGFzc2VzIHRoYXQgYXJlIG5vdCBwdWJsaWMgc3RhdGljLjxicj4KLQkgKiA1LiBTaG91bGQgbm90IGhhdmUgJ211bHR5IGluaGVyaXRhbmNlJy4gVGhpcyBtZWFucyBpZiBjbGFzcyBleHRlbmRzIGNsYXNzIG90aGVyIHRoYW4gamF2YS5sYW5nLk9iamVjdCBpdCBzaG91bGQgbm90IGltcGxlbWVudCBpbnRlcmZhY2UuIEluCi0JICogb3Bvc2l0ZSBpZiB0aGUgY2xhc3MgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IGl0IHNob3VsZCBpbXBsZW1lbnQgb25seSBvbmUgaW50ZXJmYWNlLiBGb2xsb3dpbmcgaW50ZXJmYWNlcyBhcmUgbm90IGNoZWNrZWQ6PGJyPgotCSAqIDxicj4KLQkgKiAKLQkgKiA8dWw+Ci0JICogamF2YS5sYW5nLkNvbXBhcmFibGU8YnI+Ci0JICogamF2YS5sYW5nLkNsb25hYmxlPGJyPgotCSAqIGphdmEuaW8uU2VyaWFsaXphYmxlCi0JICogPC91bD4KLQkgKiA8L3VsPgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIC0KLQkgKiAgICAgICAgICAgIGNoZWNrZWQgdHlwZQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogQHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uCi0JICogQHNlZSBUeXBlVmFsaWRhdG9yIGZvciBsaXN0IG9mIGFsbG93ZWQgamF2YSB0eXBlcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhbGlkYXRlKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIFN0cmluZyB0eXBlTmFtZSA9IHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCi0JCS8vIGNoZWNrIGZvciB0eXBlcyBmcm9tIGphdmEuKiBwYWNrYWdlcwotCQlpZiAoaXNKYXZhVHlwZSh0eXBlTmFtZSkpCi0JCXsKLQkJCWlmIChpc0FsbG93ZWRKYXZhVHlwZSh0eXBlTmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJaWYgKEZsYWdzLmlzRW51bSh0eXBlLmdldFR5cGUoKS5nZXRGbGFncygpKSkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGlzWG1sQW5ub3RhdGVkKHR5cGUuZ2V0VHlwZSgpKSkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoaGFzT2JqZWN0RmFjdG9yeU1ldGhvZCh0eXBlLmdldFR5cGUoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0eXBlLmlzSW50ZXJmYWNlKCkpCi0JCXsKLQkJCXRocm93IG5ldyBJbnRlcmZhY2VzTm90U3VwcG9ydGVkRXhjZXB0aW9uKHR5cGVOYW1lKTsKLQkJfQotCi0JCWlmIChpc0V4dGVuZGluZ0NvbGxlY3Rpb25Pck1hcCh0eXBlKSkKLQkJewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCF0eXBlLmhhc0RlZmF1bHRDb25zdHJ1Y3RvcigpKQotCQl7Ci0JCQl0aHJvdyBuZXcgTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24odHlwZU5hbWUpOwotCQl9Ci0KLQkJY2hlY2tSZW1vdGVOb3RJbXBsZW1lbnRlZCh0eXBlKTsKLQkJY2hlY2tNdWx0aXBsZUluaGVyaXRhbmNlKHR5cGUpOwotCQljaGVja0ZvckluYWRtaXNzYWJsZUlubmVyQ2xhc3Nlcyh0eXBlKTsKLQkJY2hlY2tBYnN0cmFjdE5vdEltcGxlbWVudGVkKHR5cGUpOwotCQljaGVja1B1YmxpY0F0dHJpYnV0ZXModHlwZSk7Ci0JCWNoZWNrVHlwZXNVc2VkSW5Qcm9wZXJ0aWVzKHR5cGUpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzT2JqZWN0RmFjdG9yeU1ldGhvZChmaW5hbCBJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIAotCXsKLQkJaWYgKHR5cGUuZ2V0SmF2YVByb2plY3QoKT09bnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlmaW5hbCBTdHJpbmcgcGFjayA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJZmluYWwgU3RyaW5nIG9iamVjdEZhY3RvcnlGUU5hbWUgPSBwYWNrLmxlbmd0aCgpPT0wID8gT0JKRUNUX0ZBQ1RPUlkgOiBwYWNrICsgJy4nICsgT0JKRUNUX0ZBQ1RPUlk7Ci0JCQotCQlmaW5hbCBJVHlwZSBvYmplY3RGYWN0b3J5ID0gdHlwZS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKG9iamVjdEZhY3RvcnlGUU5hbWUpOwotCQlpZiAob2JqZWN0RmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoY29udGFpbnNDcmVhdGVNZXRob2Qob2JqZWN0RmFjdG9yeSwgdHlwZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNDcmVhdGVNZXRob2QoZmluYWwgSVR5cGUgb2JqZWN0RmFjdG9yeSwgZmluYWwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsJCQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogb2JqZWN0RmFjdG9yeS5nZXRNZXRob2RzKCkpIAotCQl7Ci0JCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmb3IgKFN0cmluZyBuYW1lIDogVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlcyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCB0eXBlKSkgewotCQkJCWlmICh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgPGNvZGU+dHlwZTwvY29kZT4gaXMgYW5ub3RhdGVkIHdpdGggYW5ub3RhdGlvbiBhZmZlY3RpbmcgbWFwcGluZyB0byBYTUwuIAotCSAqIEFsd2F5cyByZXR1cm5zIGZhbHNlIGluIGNhc2UgPGNvZGU+dHlwZTwvY29kZT4gaXMgYmluYXJ5IGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1htbEFubm90YXRlZChJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlpZiAodHlwZS5pc0JpbmFyeSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlhbm5vdGF0aW9uSW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3Rvcih0eXBlKTsKLQkJSUFubm90YXRpb248SVR5cGU+IHR5cGVBbm5vdGF0aW9uID0gYW5ub3RhdGlvbkluc3BlY3Rvci5pbnNwZWN0VHlwZShYTUxfVFlQRV9BTk5PVEFUSU9OKTsKLQkJaWYgKHR5cGVBbm5vdGF0aW9uIT1udWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJdHlwZUFubm90YXRpb24gPSBhbm5vdGF0aW9uSW5zcGVjdG9yLmluc3BlY3RUeXBlKFdFQl9GQVVMVF9BTk5PVEFUSU9OKTsKLQkJaWYgKHR5cGVBbm5vdGF0aW9uIT1udWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBjaGVjayBvbiBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBvZiB0eXBlLiAxLiBDaGVja3MgaWYgdGhlIHR5cGUgaXMgYSBqYXZhIEFQSSBjbGFzcyB3aGV0aGVyIGl0IGlzIHN1cHBvcnRlZC4gMi4gSWYgaXMgb3RoZXIgdHlwZQotCSAqIHBlcmZvcm0gcnV0aW1lIGNsYXNzIGNoZWNrIHVzaW5nIHZhbGlkYXRlKFR5cGVQcm94eSB0eXBlKSBtZXRob2QuCi0JICogCi0JICogQHNlZSBSdW50aW1lVHlwZVZhbGlkYXRvciAtIGNoZWNrVHlwZShUeXBlUHJveHkgdHlwZSkgbWV0aG9kLgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tQdWJsaWNBdHRyaWJ1dGVzKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlUeXBlIGlUeXBlID0gdHlwZS5nZXRUeXBlKCk7Ci0JCWZvciAoSUZpZWxkIGZpZWxkIDogaVR5cGUuZ2V0RmllbGRzKCkpCi0JCXsKLQkJCWlmIChGbGFncy5pc1B1YmxpYyhmaWVsZC5nZXRGbGFncygpKSkKLQkJCXsKLQkJCQlyZXNvbHZlQW5kQ2hlY2tUeXBlKGZpZWxkLmdldFR5cGVTaWduYXR1cmUoKSwgaVR5cGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIDxjb2RlPnR5cGU8L2NvZGU+IGltcGxlbWVudHMge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ufSBvciB7QGxpbmsgamF2YS51dGlsLk1hcH0KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gdHJ1ZSAtIGlmIGltcGxlbWVudHMge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ufSBvciB7QGxpbmsgamF2YS51dGlsLk1hcH0KLQkgKiBAdGhyb3dzIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRXh0ZW5kaW5nQ29sbGVjdGlvbk9yTWFwKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJaWYgKHR5cGUuaXNJbXBsZW1lbnRpbmcoR2VuZXJhbFR5cGVzTmFtZXMuSkFWQV9VVElMX0NPTExFQ1RJT04pKQotCQl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmICh0eXBlLmlzSW1wbGVtZW50aW5nKEdlbmVyYWxUeXBlc05hbWVzLkpBVkFfVVRJTF9NQVApKQotCQl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdHlwZXMgdXNlZCBhcyByZXR1cm4gdmFsdWUsIHBhcmFtZXRlciB0eXBlcy4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEB0aHJvd3MgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrVHlwZXNVc2VkSW5Qcm9wZXJ0aWVzKFR5cGVBZGFwdGVyIHR5cGUpIHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlUeXBlIGlUeXBlID0gdHlwZS5nZXRUeXBlKCk7Ci0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiBpVHlwZS5nZXRNZXRob2RzKCkpCi0JCXsKLQkJCS8vIENvbnN0cnVjdG9ycyBhcmUgbm90IHZhbGlkYXRlZAotCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgfHwgaXNYbWxUcmFuc2llbnQobWV0aG9kKSkKLQkJCXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gb25seSBnZXR0ZXJzIGFyZSB2YWxpZGF0ZWQKLQkJCWlmICghaXNHZXR0ZXIobWV0aG9kKSkKLQkJCXsvLyB8fCAhZmluZFNldHRlcihtZXRob2QpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlyZXNvbHZlQW5kQ2hlY2tUeXBlKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzR2V0dGVyKGZpbmFsIElNZXRob2QgbWV0aG9kKQotCXsKLQkJcmV0dXJuIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpLnN0YXJ0c1dpdGgoR0VUKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNYbWxUcmFuc2llbnQoSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWlmIChtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpLmlzQmluYXJ5KCkpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWFubm90YXRpb25JbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBtZXRob2RBbm5vdGF0aW9ucyA9IGFubm90YXRpb25JbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChtZXRob2QpOwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlmb3IgKElBbm5vdGF0aW9uPElNZXRob2Q+IG1ldGhvZEFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9ucykKLQkJewotCQkJaWYobWV0aG9kQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhYTUxfVFJBTlNJRU5UX0FOTk9UQVRJT04pIHx8Ci0JCQkJCW1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoWE1MX1RSQU5TSUVOVF9BTk5PVEFUSU9OX1NIT1JUKSkKLQkJCXsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIHR5cGUgY2hlY2sgd2l0aCB0eXBlIHJlc29sdmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZU5hbWUKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogQHRocm93cyBUeXBlTm90Rm91bmRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzb2x2ZUFuZENoZWNrVHlwZShTdHJpbmcgdHlwZU5hbWUsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbiwgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbgotCXsKLQkJaWYoaXNWYXJpYWJsZVR5cGUodHlwZU5hbWUsIHR5cGUpKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvciAoU3RyaW5nIHJlc29sdmVkVHlwZSA6IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZXModHlwZU5hbWUsIHR5cGUpKQotCQl7Ci0JCQlpZiAoUHJpbWl0aXZlVHlwZUhhbmRsZXIuaXNWb2lkVHlwZShyZXNvbHZlZFR5cGUpKQotCQkJewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoaXNKYXZhVHlwZShyZXNvbHZlZFR5cGUpICYmIGlzQWxsb3dlZEphdmFUeXBlKHJlc29sdmVkVHlwZSkpCi0JCQl7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXZhbGlkYXRlSW50ZXJuYWwobmV3IFR5cGVBZGFwdGVyKFR5cGVGYWN0b3J5LmNyZWF0ZShyZXNvbHZlZFR5cGUsIHR5cGUpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgaWYgPGNvZGU+dHlwZTwvY29kZT4gaXMgYWJzdHJhY3QgY2xhc3Mgd2hldGhlciBpdCBpcyBpbXBsZW1lbnRlZCBieSBzb21lIGNsYXNzIGNhcGFibGUgZm9yIHJ1bnRpbWUgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0Fic3RyYWN0Tm90SW1wbGVtZW50ZWQoVHlwZUFkYXB0ZXIgdHlwZSkgdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJLy8gY2hlY2sgZm9yIGltcGxlbWVudG9yIGZvciBhYnN0cmFjdCBjbGFzcwotCQlpZiAodHlwZS5pc0Fic3RyYWN0KCkgJiYgIWlzSW1wbGVtZW50ZWQodHlwZS5nZXRUeXBlKCkpKQotCQl7Ci0JCQl0aHJvdyBuZXcgQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uKHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPmJhc2U8L2NvZGU+IGNsYXNzIGhhcyBzb21lIG5vbiBhYnN0cmFjdCBpbXBsZW1lbnRvciB3aGljaCBpcyBjYXBhYmxlIGZvciBydW50aW1lIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlCi0JICogICAgICAgICAgICBjaGVja2VkIHR5cGUKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ltcGxlbWVudGVkKElUeXBlIGJhc2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWlmIChiYXNlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhHZW5lcmFsVHlwZXNOYW1lcy5KQVZBX0xBTkdfT0JKRUNUKQotCQkJCQkJCQkJCXx8IGJhc2UuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKEdlbmVyYWxUeXBlc05hbWVzLkpBVkFfSU9fU0VSSUFMSVpBQkxFKSkKLQkJewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlJVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5ID0gYmFzZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCQlJVHlwZVtdIGNsYXNzZXMgPSB0eXBlSGllcmFyY2h5LmdldEFsbFN1YnR5cGVzKGJhc2UpOwotCi0JCUlUeXBlIGNsYXNzQ2FuZGlkYXRlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQljbGFzc0NhbmRpZGF0ZSA9IGNsYXNzZXNbaV07Ci0KLQkJCWlmIChjYW5CZVVzZWRBc1JUQ2xhc3MoY2xhc3NDYW5kaWRhdGUpKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBnaXZlbiB0eXBlIGlzIHN1aXRhYmxlIGZvciBjbGFzcy9pbnRlcmZhY2UgaW1wbGVtZW50b3IuIENsYXNzIHNob3VsZCBub3QgYmUgYWJzdHJhY3QsIGludGVyZmFjZSBhbmQgc2hvdWxkIGNvbXBseSB0byB0aGUgcnVsZXMgZGVmaW5lZAotCSAqIGluIGNoZWNrVHlwZSBkb2N1bWVudGF0aW9uLgotCSAqIAotCSAqIEBzZWUgUnVudGltZVR5cGVWYWxpZGF0b3IgLSBjaGVja1R5cGUoVHlwZVByb3h5IHR5cGUpIG1ldGhvZC4KLQkgKiBAcGFyYW0gdHlwZSAtCi0JICogICAgICAgICAgICBjaGVja2VkIHR5cGUKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5CZVVzZWRBc1JUQ2xhc3MoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJaW50IGZsYWdzID0gdHlwZS5nZXRGbGFncygpOwotCi0JCWlmICghdHlwZS5pc0NsYXNzKCkgfHwgRmxhZ3MuaXNBYnN0cmFjdChmbGFncykpCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChGbGFncy5pc0ludGVyZmFjZShmbGFncykgfHwgdHlwZS5pc0Fub255bW91cygpKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayBzdWIgdHlwZSBpZiBpdCBpcyBhbGxvd2VkIGFzIHJ0IGNsYXNzZXMKLQkJdHJ5Ci0JCXsKLQkJCVR5cGVBZGFwdGVyIHRwID0gbmV3IFR5cGVBZGFwdGVyKHR5cGUpOwotCQkJdmFsaWRhdGVJbnRlcm5hbCh0cCk7Ci0JCX0gY2F0Y2ggKEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gJEpMLUVYQyQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHR5cGUgaXMgYSB2YXJpYWJsZSB0eXBlIChsaWtlIGUuZy4gIlQiIGluIEhvbGRlciZsdFQmZ3QpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFyaWFibGVUeXBlKGZpbmFsIFN0cmluZyB0eXBlTmFtZSwgZmluYWwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZChUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGUodHlwZU5hbWUsIHR5cGUpKSA9PSBTaWduYXR1cmUuVFlQRV9WQVJJQUJMRV9TSUdOQVRVUkU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL1NlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzZjZDA3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLlR5cGVSZXNvbHZlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotDQotLyoqDQotICogVmFsaWRhdGVzIFNFSSBhZ2FpbnN0IGltcGxlbWVudGF0aW9uIGJlYW4uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBJVHlwZSBzZWlUeXBlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2VpVHlwZQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+c2VpVHlwZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5zZWlUeXBlPC9jb2RlPiBpcyBub3QgYSBpbnRlcmZhY2UNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcihmaW5hbCBJVHlwZSBzZWlUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShzZWlUeXBlKTsNCi0JCQ0KLQkJaWYgKCFzZWlUeXBlLmlzSW50ZXJmYWNlKCkpIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWlUeXBlIHNob3VsZCBiZSBpbnRlcmZhY2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLSAJCQ0KLQkJdGhpcy5zZWlUeXBlID0gc2VpVHlwZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVmFsaWRhdGVzIHByb3ZpZGVkIGluIGNvbnN0cnVjdG9yIFNFSSBhZ2FpbnN0IDx0dD5iZWFuVHlwZTwvdHQ+LiBUaGUgPHR0PmJlYW5UeXBlPC90dD4gc2hvdWxkIGltcGxlbWVudCBhbGwNCi0JICogDQotCSAqIEBwYXJhbSBiZWFuVHlwZQ0KLQkgKiBAcmV0dXJuIHN0YXR1cyBvYmplY3Qgd2l0aCBzZXQgc2V2ZXJpdHkgYW5kIG1lc3NhZ2UNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKGZpbmFsIElUeXBlIGJlYW5UeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyBiZWFuRlFOYW1lID0gYmVhblR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotCQlpZiAoaW1wbGVtZW50c1NFSShiZWFuVHlwZSkpDQotCQl7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMobnVsbCwgbnVsbCk7DQotCQl9DQotDQotCQlmb3IgKElNZXRob2Qgc2VpTWV0aG9kIDogY29sbGVjdEludGVyZmFjZU1ldGhvZHMoc2VpVHlwZSkpDQotCQl7DQotCQkJSU1ldGhvZCBiZWFuTWV0aG9kID0gZmluZE1ldGhvZEluQmVhbihzZWlNZXRob2QsIGJlYW5UeXBlKTsNCi0JCQlpZiAoYmVhbk1ldGhvZCA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3JfTUVUSE9EX05PVF9GT1VORCwgZm9ybWF0TWV0aG9kU2lnbmF0dXJlKHNlaU1ldGhvZCksIGJlYW5GUU5hbWUpLA0KLQkJCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQotCQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgNCi0JCQkJCQkJCQkJCQkiTWV0aG9kIHswfSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGJlYW4gezF9LiBJdCBpcyByZXF1aXJlZCB0aGF0IHRoZSBiZWFuIGltcGxlbWVudHMgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBzcGVjaWZpZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQkJYmVhbkZRTmFtZSkpKTsNCi0JCQl9DQotDQotCQkJaWYgKCFGbGFncy5pc1B1YmxpYyhiZWFuTWV0aG9kLmdldEZsYWdzKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3JfTUVUSE9EX05PVF9QVUJMSUMsIGZvcm1hdE1ldGhvZFNpZ25hdHVyZShzZWlNZXRob2QpLCBiZWFuRlFOYW1lKSwNCi0JCQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoDQotCQkJCQkJCQkJCQkJIiBNZXRob2QgezB9IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWFuIHsxfSBpcyBub3QgcHVibGljIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGV4cG9zZWQgYXMgYSB3ZWIgc2VydmljZSBvcGVyYXRpb24iLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQkJYmVhbkZRTmFtZSkpKTsNCi0JCQl9DQotDQotCQkJaWYgKCFoYXNTYW1lRXhjZXB0aW9ucyhzZWlNZXRob2QsIGJlYW5NZXRob2QpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3JfTUVUSE9EX0hBU0RJRkZFUkVOVF9FWENFUFRJT05TLCBmb3JtYXRNZXRob2RTaWduYXR1cmUoc2VpTWV0aG9kKSwgYmVhbkZRTmFtZSksDQotCQkJCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KA0KLQkJCQkJCQkJCQkJCSJNZXRob2QgezB9IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWFuIHsxfSBpcyBkZWNsYXJlZCB0byB0aHJvdyBleGNlcHRpb25zIHRoYXQgZGlmZmVyIGZyb20gZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIHNhbWUgbWV0aG9kIGluIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCQliZWFuRlFOYW1lKSkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBwcmVwYXJlU3RhdHVzKG51bGwsIG51bGwpOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBpbXBsZW1lbnRzU0VJKGZpbmFsIElUeXBlIGJlYW5UeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoU3RyaW5nIGludGVyZmFjZU5hbWUgOiBiZWFuVHlwZS5nZXRTdXBlckludGVyZmFjZU5hbWVzKCkpDQotCQl7DQotCQkJU3RyaW5nIGludGVyZmFjZUZRTmFtZSA9IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZShpbnRlcmZhY2VOYW1lLCBiZWFuVHlwZSk7DQotCQkJaWYgKGludGVyZmFjZUZRTmFtZS5lcXVhbHMoc2VpVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJpdmF0ZSBJTWV0aG9kIGZpbmRNZXRob2RJbkJlYW4oZmluYWwgSU1ldGhvZCBzZWlNZXRob2QsIGZpbmFsIElUeXBlIGJlYW5UeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoSU1ldGhvZCBiZWFuTWV0aG9kIDogYmVhblR5cGUuZ2V0TWV0aG9kcygpKQ0KLQkJew0KLQkJCWlmICghc2VpTWV0aG9kLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGJlYW5NZXRob2QuZ2V0RWxlbWVudE5hbWUoKSkpDQotCQkJew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotDQotCQkJaWYgKGhhc1NhbWVSZXR1cm5UeXBlKHNlaU1ldGhvZCwgYmVhbk1ldGhvZCkgJiYgaGFzU2FtZVBhcmFtcyhzZWlNZXRob2QsIGJlYW5NZXRob2QpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGJlYW5NZXRob2Q7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGJlYW5UeXBlLmdldFN1cGVyY2xhc3NOYW1lKCkgPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCWZpbmFsIFN0cmluZyBzdXBlclR5cGVOYW1lID0gVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlKGJlYW5UeXBlLmdldFN1cGVyY2xhc3NOYW1lKCksIGJlYW5UeXBlKTsNCi0NCi0JCXJldHVybiBmaW5kTWV0aG9kSW5CZWFuKHNlaU1ldGhvZCwgYmVhblR5cGUuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzdXBlclR5cGVOYW1lKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGhhc1NhbWVSZXR1cm5UeXBlKGZpbmFsIElNZXRob2Qgc2VpTWV0aG9kLCBmaW5hbCBJTWV0aG9kIGJlYW5NZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgTGlzdDxTdHJpbmc+IHNlaVJldFR5cGUgPSBUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGVzKHNlaU1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIHNlaU1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOw0KLQkJZmluYWwgTGlzdDxTdHJpbmc+IGJlYW5SZXRUeXBlID0gVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlcyhiZWFuTWV0aG9kLmdldFJldHVyblR5cGUoKSwgYmVhbk1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOw0KLQ0KLQkJaWYgKCFhcmVTYW1lVHlwZXMoc2VpUmV0VHlwZSwgYmVhblJldFR5cGUpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBoYXNTYW1lUGFyYW1zKGZpbmFsIElNZXRob2Qgc2VpTWV0aG9kLCBmaW5hbCBJTWV0aG9kIGJlYW5NZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nW10gc2VpUGFyYW1UeXBlcyA9IHNlaU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOw0KLQkJZmluYWwgU3RyaW5nW10gYmVhblBhcmFtVHlwZXMgPSBiZWFuTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7DQotCQlpZiAoc2VpUGFyYW1UeXBlcy5sZW5ndGggIT0gYmVhblBhcmFtVHlwZXMubGVuZ3RoKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCUxpc3Q8U3RyaW5nPiBzZWlQYXJhbVR5cGUgPSBudWxsOw0KLQkJTGlzdDxTdHJpbmc+IGJlYW5QYXJhbVR5cGUgPSBudWxsOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWlQYXJhbVR5cGVzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCXNlaVBhcmFtVHlwZSA9IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZXMoc2VpUGFyYW1UeXBlc1tpXSwgc2VpTWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSk7DQotCQkJYmVhblBhcmFtVHlwZSA9IFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZXMoYmVhblBhcmFtVHlwZXNbaV0sIGJlYW5NZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpKTsNCi0NCi0JCQlpZiAoIWFyZVNhbWVUeXBlcyhzZWlQYXJhbVR5cGUsIGJlYW5QYXJhbVR5cGUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBhcmVTYW1lVHlwZXMoZmluYWwgTGlzdDxTdHJpbmc+IHNlaVR5cGVOYW1lcywgZmluYWwgTGlzdDxTdHJpbmc+IGJlYW5UeXBlTmFtZXMpDQotCXsNCi0JCWlmIChzZWlUeXBlTmFtZXMuc2l6ZSgpICE9IGJlYW5UeXBlTmFtZXMuc2l6ZSgpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VpVHlwZU5hbWVzLnNpemUoKTsgaSsrKQ0KLQkJew0KLQkJCWlmICghc2VpVHlwZU5hbWVzLmdldChpKS5lcXVhbHMoYmVhblR5cGVOYW1lcy5nZXQoaSkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXByaXZhdGUgTGlzdDxJTWV0aG9kPiBjb2xsZWN0SW50ZXJmYWNlTWV0aG9kcyhmaW5hbCBJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIExpc3Q8SU1ldGhvZD4gYWxsTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8SU1ldGhvZD4oKTsNCi0JCUNvbGxlY3Rpb25zLmFkZEFsbChhbGxNZXRob2RzLCB0eXBlLmdldE1ldGhvZHMoKSk7DQotDQotCQlmb3IgKFN0cmluZyBzdXBlckludGVyZmFjZU5hbWUgOiB0eXBlLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKSkNCi0JCXsNCi0JCQlTdHJpbmcgc3VwZXJGUU5hbWUgPSBUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGUoc3VwZXJJbnRlcmZhY2VOYW1lLCB0eXBlKTsNCi0JCQlJVHlwZSBzdXBlclR5cGUgPSB0eXBlLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc3VwZXJGUU5hbWUsIChJUHJvZ3Jlc3NNb25pdG9yKSBudWxsKTsNCi0NCi0JCQlhc3NlcnQgKHN1cGVyVHlwZSAhPSBudWxsKTsNCi0NCi0JCQlhbGxNZXRob2RzLmFkZEFsbChjb2xsZWN0SW50ZXJmYWNlTWV0aG9kcyhzdXBlclR5cGUpKTsNCi0JCX0NCi0NCi0JCXJldHVybiBhbGxNZXRob2RzOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBoYXNTYW1lRXhjZXB0aW9ucyhJTWV0aG9kIHNlaU1ldGhvZCwgSU1ldGhvZCBiZWFuTWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChzZWlNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKS5sZW5ndGggIT0gYmVhbk1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpLmxlbmd0aCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlmaW5hbCBTZXQ8U3RyaW5nPiBzZWlFeGNlcHRpb25zID0gZ2V0UmVzb2x2ZWRFeGNlcHRpb25zKHNlaU1ldGhvZCk7DQotCQlmaW5hbCBJVHlwZSBiZWFuVHlwZSA9IGJlYW5NZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJZm9yIChTdHJpbmcgYmVhbkV4IDogYmVhbk1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpKQ0KLQkJew0KLQkJCVN0cmluZyByZXNvbHZlZE5hbWUgPSBUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGUoU2lnbmF0dXJlLnRvU3RyaW5nKGJlYW5FeCksIGJlYW5UeXBlKTsNCi0JCQlpZiAoIXNlaUV4Y2VwdGlvbnMuY29udGFpbnMocmVzb2x2ZWROYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFNldDxTdHJpbmc+IGdldFJlc29sdmVkRXhjZXB0aW9ucyhJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTZXQ8U3RyaW5nPiBleGNlcHRpb25zRlFOcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4obWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCkubGVuZ3RoKTsNCi0JCWZpbmFsIElUeXBlIGRlY2xhcmluZ1R5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQ0KLQkJZm9yIChTdHJpbmcgZXhjZXB0aW9uIDogbWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCkpDQotCQl7DQotCQkJZXhjZXB0aW9uc0ZRTnMuYWRkKFR5cGVSZXNvbHZlci5yZXNvbHZlVHlwZShTaWduYXR1cmUudG9TdHJpbmcoZXhjZXB0aW9uKSwgZGVjbGFyaW5nVHlwZSkpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGV4Y2VwdGlvbnNGUU5zOw0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIGZvcm1hdE1ldGhvZFNpZ25hdHVyZShmaW5hbCBJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmdCdWZmZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoU2lnbmF0dXJlLnRvU3RyaW5nKG1ldGhvZC5nZXRTaWduYXR1cmUoKSwgbWV0aG9kLmdldEVsZW1lbnROYW1lKCksIG1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpLA0KLQkJCQkJCQkJCQl0cnVlLCBmYWxzZSkpOw0KLQkJbmFtZS5hcHBlbmQoIiA6ICIpOyAvLyROT04tTkxTLTEkDQotCQluYW1lLmFwcGVuZChTaWduYXR1cmUudG9TdHJpbmcobWV0aG9kLmdldFJldHVyblR5cGUoKSkpOw0KLQ0KLQkJcmV0dXJuIG5hbWUudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElTdGF0dXMgcHJlcGFyZVN0YXR1cyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCXJldHVybiBuZXcgU3RhdHVzKChtc2cgPT0gbnVsbCkgPyBJU3RhdHVzLk9LIDogSVN0YXR1cy5FUlJPUiwgSmF4V3NEb21SdW50aW1lUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnID09IG51bGwgPyAiIiA6IG1zZywgY2F1c2UpOyAvLyROT04tTkxTLTEkDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL1NlaVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL1NlaVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTdhZDQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9TZWlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuVHlwZVJlc29sdmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZVBsdWdpbjsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgdmFsaWRhdG9yIC0gY2hlY2tzIGlmIHN1cHBsaWVkIHR5cGUgaXMgYXBwbGljYWJsZSBmb3IgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgKFNFSSkuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBTZWlWYWxpZGF0b3INCi17DQotCQ0KLQlwcml2YXRlIGZpbmFsIE1ldGhvZFZhbGlkYXRvciBtZXRob2RWYWxpZGF0b3I7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvci4NCi0JICovDQotCXB1YmxpYyBTZWlWYWxpZGF0b3IoKQ0KLQl7DQotCQltZXRob2RWYWxpZGF0b3IgPSBuZXcgTWV0aG9kVmFsaWRhdG9yKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDxwcmU+DQotCSAqIFZhbGlkYXRlcyA8dHQ+dHlwZTwvdHQ+IGlmIGl0IGlzIGFwcGxpY2FibGUgZm9yIFNlcnZpY2UgRW50ZHBvaW50IEludGVyZmFjZS4NCi0JICogIA0KLQkgKiAgMS4gPHR0PnR5cGU8L3R0PiBtdXN0IGJlIGludGVyZmFjZQ0KLQkgKiAgMi4gPHR0PnR5cGU8L3R0PiBtdXN0IGJlIG91dGVyDQotCSAqICAzLiA8dHQ+dHlwZTwvdHQ+IG11c3QgYmUgcHVibGljDQotCSAqICA0LiBhbGwgPHR0PnR5cGU8L3R0PiBtZXRob2RzIG11c3QgYmUgZXhwb3NhYmxlIGFjY29yZGluZyB0byB0aGUgcnVsZXMgaW4ge0BsaW5rIE1ldGhvZFZhbGlkYXRvcn0NCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZSB2YWxpZGF0ZWQgdHlwZQ0KLQkgKiBAcmV0dXJuIElTdGF0dXMgb2JqZWN0IHdpdGggc3RhdHVzIHtAbGluayBJU3RhdHVzI09LfSBpbiBjYXNlIDx0dD50eXBlPC90dD4gaXMgYXBwbGljYWJsZSBmb3IgU0VJIG9yIHtAbGluayBJU3RhdHVzI0VSUk9SfSBpbiBjYXNlIHR5cGUgaXMNCi0JICogICAgICAgICBub3QgYXBwbGljYWJsZSB3aXRoIHNvbWUgaHVtYW4gcmVhZGJsZSBleHBsYW5hdGlvbiBvZiB0aGUgcHJvYmxlbS4NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDx0dD50eXBlPC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIHNlaU5hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOw0KLQkJaWYgKCF0eXBlLmlzSW50ZXJmYWNlKCkpDQotCQl7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuU2VpVmFsaWRhdG9yX05PVF9JTlRFUkZBQ0VfTVNHLCBzZWlOYW1lKSwNCi0JCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQotCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KA0KLQkJCQkJCQkJCQkJInswfSBpcyBub3QgYSBpbnRlcmZhY2UgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQlzZWlOYW1lKSkpOw0KLQkJfQ0KLQ0KLQkJaWYgKHR5cGUuaXNCaW5hcnkoKSkNCi0JCXsNCi0JCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhNZXNzYWdlRm9ybWF0LmZvcm1hdChKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5TZWlWYWxpZGF0b3JfTk9UX0NPTVBJTEFUSU9OVU5JVF9NU0csIHNlaU5hbWUpLA0KLQkJCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoDQotCQkJCQkJCQkJCQkiezB9IGlzIGEgYmluYXJ5IGludGVyZmFjZSBhbmQgY2Fubm90IGFubm90YXRlZCBhcyBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJc2VpTmFtZSkpKTsNCi0JCX0NCi0NCi0JCWlmICh0eXBlLmlzTWVtYmVyKCkpDQotCQl7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuU2VpVmFsaWRhdG9yX05PVF9PVVRFUl9NU0csIHNlaU5hbWUpLA0KLQkJCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoDQotCQkJCQkJCQkJCQkiezB9IGlzIG5vdCBhIG91dGVyIGludGVyZmFjZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgYSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCXNlaU5hbWUpKSk7DQotCQl9DQotDQotCQlpZiAoIUZsYWdzLmlzUHVibGljKHR5cGUuZ2V0RmxhZ3MoKSkpDQotCQl7DQotCQkJcmV0dXJuIHByZXBhcmVTdGF0dXMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuU2VpVmFsaWRhdG9yX05PVF9QVUJMSUNfTVNHLCBzZWlOYW1lKSwNCi0JCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQotCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KA0KLQkJCQkJCQkJCQkJInswfSBpcyBub3QgYSBwdWJsaWMgaW50ZXJmYWNlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJc2VpTmFtZSkpKTsNCi0JCX0NCi0NCi0JCXJldHVybiB2YWxpZGF0ZU1ldGhvZHModHlwZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlTWV0aG9kcyhJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlTdGF0dXMgc3RhdHVzOw0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IHR5cGUuZ2V0TWV0aG9kcygpKQ0KLQkJew0KLQkJCXN0YXR1cyA9IG1ldGhvZFZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHN0YXR1czsNCi0JCQl9DQotCQl9DQotDQotCQlmb3IgKFN0cmluZyBzdXBlckludGVyZmFjZU5hbWUgOiB0eXBlLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKSkNCi0JCXsNCi0JCQlTdHJpbmcgc3VwZXJGUU5hbWUgPSBUeXBlUmVzb2x2ZXIucmVzb2x2ZVR5cGUoc3VwZXJJbnRlcmZhY2VOYW1lLCB0eXBlKTsNCi0JCQlJVHlwZSBzdXBlclR5cGUgPSB0eXBlLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc3VwZXJGUU5hbWUpOw0KLQ0KLQkJCWFzc2VydCAoc3VwZXJUeXBlICE9IG51bGwpOw0KLQ0KLQkJCXN0YXR1cyA9IHZhbGlkYXRlTWV0aG9kcyhzdXBlclR5cGUpOw0KLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHN0YXR1czsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gcHJlcGFyZVN0YXR1cyhudWxsLCBudWxsKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElTdGF0dXMgcHJlcGFyZVN0YXR1cyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCXJldHVybiBuZXcgU3RhdHVzKChtc2cgPT0gbnVsbCkgPyBJU3RhdHVzLk9LIDogSVN0YXR1cy5FUlJPUiwgSmF4V3NEb21SdW50aW1lUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnID09IG51bGwgPyAiIiA6IG1zZywgY2F1c2UpOyAvLyROT04tTkxTLTEkDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL1R5cGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9UeXBlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2MTE5NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL1R5cGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkdlbmVyYWxUeXBlc05hbWVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnZhbGlkYXRpb24ucHJvdmlkZXIuVHlwZUFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC52YWxpZGF0aW9uLnByb3ZpZGVyLlR5cGVLZXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuSW5oZXJpdGFuY2VBbmRJbXBsZW1lbnRhdGlvbkV4ZWNwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5NdWx0aXBsZUltcGxlbWVudGF0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLlJlbW90ZU9iamVjdEV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBQcm92aWRlcyBzZXQgb2YgZ2VuZXJhbCB2YWxpZGF0aW9uIG1ldGhvZHMgd2hpY2ggY2FuIGJlIHJldXNlZCBieSBzdWJjbGFzc2VzLg0KLSAqIA0KLSAqIEBpMDM2NTA5DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVWYWxpZGF0b3INCi17DQotCS8vIHRoZXJlIGFyZSB0eXBlcyBmcm9tIHRoZSBqYXZhLiogcGFja2FnZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBydW50aW1lDQotCS8vIGFuZCBhcmUga25vd24gdG8gaXQgd2l0aG91dCBhbmFseXNpcyBvZiB0aGVyZSBzdHJ1Y3R1cmUsIHRoZXJlZm9yZSB0aGV5IGFyZQ0KLQkvLyBzdG9yZWQgYXMgZWxlbWVudGFyaWVzLg0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBKQVZBX1RZUEVTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOyAvLyAkSkwtQ09MTEVDVElPTiQNCi0NCi0JLy8gZm9yIHRoZXNlIGphdmEuKiB0eXBlcyBhdHRyaWJ1dGVzIGFyZSByZXNvbHZlZCwgaS5lIHRoZXkgYXJlIHN0b3JlZCBhcw0KLQkvLyBzdHJ1Y3R1cmUgaWYgdGhleSBjb250YWluIGZpZWxkcy4NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gQU5BTFlTRURfSkFWQV9UWVBFUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsgLy8gJEpMLUNPTExFQ1RJT04kDQotDQotCS8vIHRoZXNlIHR5cGVzIGFyZSBhbGxvd2VkIHRvIGJlIHVzZWQgaW4gY2FzZSBvZiBtdWx0eSBpbmhlcml0YW5jZQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBBTExPV0VEX0lOX01VTFRZSU5IRVJJVEFOQ0UgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7IC8vICRKTC1DT0xMRUNUSU9OJA0KLQ0KLQlwcml2YXRlIE1hcDxUeXBlS2V5LCBJU3RhdHVzPiBzdGF0dXNNYXAgPSBuZXcgSGFzaE1hcDxUeXBlS2V5LCBJU3RhdHVzPigpOw0KLQ0KLQkvLyBjYWNoZSBvZiBhbHJlYWR5IGFuYWx5emVkIHR5cGVzDQotCXByaXZhdGUgU2V0PFR5cGVLZXk+IGFuYWx5emVkID0gbmV3IEhhc2hTZXQ8VHlwZUtleT4oKTsNCi0NCi0Jc3RhdGljDQotCXsNCi0JCS8vIFRoZXJlIGFyZSB0eXBlcyBmcm9tIHRoZSBqYXZhLiogcGFja2FnZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBydW50aW1lDQotCQkvLyBhbmQgYXJlIGtub3duIHRvIGl0IHdpdGhvdXQgYW5hbHlzaXMgb2YgdGhlcmUgc3RydWN0dXJlLCB0aGVyZWZvcmUgdGhleSBhcmUNCi0JCS8vIHN0b3JlZCBhcyBlbGVtZW50YXJpZXMuDQotDQotCQkvLyBEYXRlL1RpbWUgU3BlY2lmaWMgVHlwZXMNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuQ2FsZW5kYXIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5EYXRlIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhciIpOyAvLyROT04tTkxTLTEkCQ0KLQ0KLQkJLy8gQXJyYXkgQmFzZWQgVHlwZXMNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuQXJyYXlMaXN0Iik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuSGFzaFNldCIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkxpbmtlZExpc3QiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5MaXN0Iik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuU3RhY2siKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5WZWN0b3IiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJLy8gT3RoZXJzDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5tYXRoLkJpZ0RlY2ltYWwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubWF0aC5CaWdJbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuVVVJRCIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5uZXQuVVJJIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLmF3dC5JbWFnZSIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciIpOyAvLyROT04tTkxTLTEkDQotDQotCQkvLyBKYXZhIHByaW1pdGl2ZSB0eXBlIHdyYXBwZXIgY2xhc3Nlcw0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5TdHJpbmciKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Cb29sZWFuIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkNoYXJhY3RlciIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkZsb2F0Iik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuQnl0ZSIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkRvdWJsZSIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkxvbmciKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5TaG9ydCIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLlZvaWQiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkDQotDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS5pby5TZXJpYWxpemFibGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5DbG9uZWFibGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Db21wYXJhYmxlIik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuTWFwIik7IC8vJE5PTi1OTFMtMSQNCi0JCUpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuSGFzaE1hcCIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkhhc2h0YWJsZSIpOyAvLyROT04tTkxTLTEkDQotCQlKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJLy8gRm9yIHRoZXNlIGphdmEuKiB0eXBlcyBhdHRyaWJ1dGVzIGFyZSByZXNvbHZlZCwgaS5lIHRoZXkgYXJlIHN0b3JlZCBhcw0KLQkJLy8gc3RydWN0dXJlIGlmIHRoZXkgY29udGFpbiBmaWVsZHMuDQotCQlBTkFMWVNFRF9KQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkV4Y2VwdGlvbiIpOyAvLyROT04tTkxTLTEkDQotCQlBTkFMWVNFRF9KQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLlRocm93YWJsZSIpOyAvLyROT04tTkxTLTEkDQotCQlBTkFMWVNFRF9KQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCUFMTE9XRURfSU5fTVVMVFlJTkhFUklUQU5DRS5hZGQoR2VuZXJhbFR5cGVzTmFtZXMuSkFWQV9MQU5HX0NMT05FQUJMRSk7IC8vICROT04tTkxTJA0KLQkJQUxMT1dFRF9JTl9NVUxUWUlOSEVSSVRBTkNFLmFkZChHZW5lcmFsVHlwZXNOYW1lcy5KQVZBX0lPX1NFUklBTElaQUJMRSk7IC8vICROT04tTkxTJA0KLQkJQUxMT1dFRF9JTl9NVUxUWUlOSEVSSVRBTkNFLmFkZChHZW5lcmFsVHlwZXNOYW1lcy5KQVZBX0xBTkdfQ09NUEFSQUJMRSk7IC8vICROT04tTkxTJA0KLQl9DQotDQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvVmFsaWRhdGUoVHlwZUFkYXB0ZXIgdHlwZSkgdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFZhbGlkYXRlcyA8Y29kZT50eXBlPC9jb2RlPi4gVGhlIGZpcnN0IHN0ZXAgaXMgdGhvIGNoZWNrIHRoZSBjYWNoZSBpZiB0aGlzIHR5cGUgaGFzIGJlZW4gY2hlY2tlZCBhbHJlYWR5LiBJZiB5ZXMgdGhlIHByZXZpdW9zIHZhbGlkYXRpb24NCi0JICogcmVzdWx0IGlzIHJldHVybmVkIGlmIG5vIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGFuZCB0aGUgcmVzdWx0IGlzIGNoYWNoZWQuIEludGVybmFsbHkgY2FsbHMgZG9WYWxpZGF0ZSh0eXBlKSB3aGljaCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkNCi0JICogZXh0ZW5kaW5nIGNsYXNzZXMuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZSAtDQotCSAqICAgICAgICAgICAgY2hlY2tlZCB0eXBlDQotCSAqIEB0aHJvd3MgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVR5cGUgdHlwZSkgdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlhbmFseXplZC5jbGVhcigpOw0KLQkJdmFsaWRhdGVJbnRlcm5hbChuZXcgVHlwZUFkYXB0ZXIodHlwZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBWYWxpZGF0ZXMgPGNvZGU+dHlwZTwvY29kZT4uIFRoZSBmaXJzdCBzdGVwIGlzIHRobyBjaGVjayB0aGUgY2FjaGUgaWYgdGhpcyB0eXBlIGhhcyBiZWVuIGNoZWNrZWQgYWxyZWFkeS4gSWYgeWVzIHRoZSBwcmV2aXVvcyB2YWxpZGF0aW9uDQotCSAqIHJlc3VsdCBpcyByZXR1cm5lZCBpZiBubyBhIGNoZWNrIGlzIHBlcmZvcm1lZCBhbmQgdGhlIHJlc3VsdCBpcyBjaGFjaGVkLiBJbnRlcm5hbGx5IGNhbGxzIGRvVmFsaWRhdGUodHlwZSkgd2hpY2ggc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5DQotCSAqIGV4dGVuZGluZyBjbGFzc2VzLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUgLQ0KLQkgKiAgICAgICAgICAgIGNoZWNrZWQgdHlwZQ0KLQkgKiBAdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSW50ZXJuYWwoVHlwZUFkYXB0ZXIgdHlwZSkgdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBUeXBlS2V5IGtleSA9IG5ldyBUeXBlS2V5KHR5cGUuZ2V0UHJvamVjdE5hbWUoKSwgdHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOw0KLQ0KLQkJLy8gY2hlY2sgZm9yIGNpcmN1bGFyIHR5cGUgY2hlY2sNCi0JCWlmIChhbmFseXplZC5jb250YWlucyhrZXkpKQ0KLQkJew0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCWFuYWx5emVkLmFkZChrZXkpOw0KLQ0KLQkJZmluYWwgSVN0YXR1cyBzdGF0dXMgPSBzdGF0dXNNYXAuZ2V0KGtleSk7DQotCQlpZiAoc3RhdHVzICE9IG51bGwpDQotCQl7DQotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQ0KLQkJCXRocm93IChJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uKSBzdGF0dXMuZ2V0RXhjZXB0aW9uKCk7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlkb1ZhbGlkYXRlKHR5cGUpOw0KLQkJCXN0YXR1c01hcC5wdXQoa2V5LCBwcmVwYXJlU3RhdHVzKG51bGwpKTsNCi0JCX0gY2F0Y2ggKEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlzdGF0dXNNYXAucHV0KGtleSwgcHJlcGFyZVN0YXR1cyhlKSk7DQotCQkJdGhyb3cgZTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogaWYgPGNvZGU+dGhyb3dhYmxlPC9jb2RlPiBpcyBudWxsIHByZXBhcmVzIHN0YXR1cyB3aXRoIHNldmVyaXR5IElTdGF0dXMuT0sgYW5kIGVtcHR5IG1lc3NhZ2UuIElmIDxjb2RlPnRocm93YWJsZTwvY29kZT4gaXMgbm90IG51bGwNCi0JICogcHJlcGFyZXMgc3RhdHVzIHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5FUlJPUiBhbmQgbWVzc2FnZSB0aGUgY29udGFpbmVkIGluIDxjb2RlPnRocm93YWJsZTwvY29kZT4gZXJyb3IgbWVzc2FnZS4NCi0JICogDQotCSAqIEBwYXJhbSB0aHJvd2FibGUNCi0JICogQHJldHVybiBJU3RhdHVzIHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5PSyBpZiA8dHQ+dGhyb3dhYmxlPC90dD4gaXMgbnVsbCAsIG9yIElTdGF0dXMuRVJST1IgaW5jbHVkaW5nIGVycm9yIG1lc3NhZ2UgZGVjcmliaW5nIHRoZSBwcm9ibGVtLg0KLQkgKi8NCi0JcHJpdmF0ZSBJU3RhdHVzIHByZXBhcmVTdGF0dXMoVGhyb3dhYmxlIHRocm93YWJsZSkNCi0Jew0KLQkJZmluYWwgSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKCh0aHJvd2FibGUgPT0gbnVsbCkgPyBJU3RhdHVzLk9LIDogSVN0YXR1cy5FUlJPUiwgSmF4V3NEb21SdW50aW1lUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywNCi0JCQkJCQkJCQkJKHRocm93YWJsZSA9PSBudWxsKSA/ICIiIDogdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQl0aHJvd2FibGUpOw0KLQ0KLQkJcmV0dXJuIHN0YXR1czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRGVmaW5lcyBpZiA8Y29kZT50eXBlTmFtZTwvY29kZT4gb25lIGZvcm0gamF2YS4qIG9yIGphdmF4LiogcGFja2FnZXMuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIDx0dD50eXBlTmFtZTwvdHQ+IGlzIGZyb20gamF2YSBzdGFuZGFyZCBjbGFzc2VzLg0KLQkgKi8NCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKYXZhVHlwZShTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCXJldHVybiB0eXBlTmFtZS5zdGFydHNXaXRoKCJqYXZhLiIpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJfHwgdHlwZU5hbWUuc3RhcnRzV2l0aCgiamF2YXguIik7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKioNCi0JICogRGVmaW5lcyBpZiA8Y29kZT50eXBlTmFtZTwvY29kZT4gaXMgYWxsb3dlZCBqYXZhIHR5cGUuIFRoZSBsaXN0IG9mIGFsbG93ZWQgamF2YSB0eXBlcyBjYW4gYmUgZm91bmQgaW4gc3RhdGljIHNlY3Rpb24gb2YgdGhpcyBjbGFzcy4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgPHR0PnR5cGVOYW1lPC90dD4gaXMgYWxsb3dlZCB0byBiZSB1c2VkIGluIFdlYiBTZXJ2aWNlLg0KLQkgKi8NCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbGxvd2VkSmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gSkFWQV9UWVBFUy5jb250YWlucyh0eXBlTmFtZSkgfHwgQU5BTFlTRURfSkFWQV9UWVBFUy5jb250YWlucyh0eXBlTmFtZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyBpZiA8Y29kZT50eXBlPC9jb2RlPiBpbXBsZW1lbnRzIGphdmEucm1pLlJlbW90ZSBpbnRlcmZhY2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGNoZWNrUmVtb3RlTm90SW1wbGVtZW50ZWQoVHlwZUFkYXB0ZXIgdHlwZSkgdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAodHlwZS5pc0ltcGxlbWVudGluZyhHZW5lcmFsVHlwZXNOYW1lcy5KQVZBX1JNSV9SRU1PVEUpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBSZW1vdGVPYmplY3RFeGNlcHRpb24odHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgaWYgPGNvZGU+dHlwZTwvY29kZT4gaW1wbGVtZW50cyBtdWx0aXBsZSBpbnRlcmZhY2VzLiBDbGFzc2VzIHRoYXQgZXh0ZW5kIGNsYXNzIG90aGVyIHRoYW4gamF2YS5sYW5nLk9iamVjdCBzaG91bGQgbm90IGltcGxlbWVudCBhbnkNCi0JICogaW50ZXJmYWNlLiBDbGFzc2VzIHRoYXQgZXh0ZW5kIGphdmEubGFuZy5PYmplY3QgY2FuIGltcGxlbWVudCBvbmx5IG9uZSBpbnRlcmZhY2UuPGJyPg0KLQkgKiA8YnI+DQotCSAqIE5vdGU6IFRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlcyBhcmUgc2tpcHBlZCBmcm9tIGNoZWNrOjxicj4NCi0JICogPHVsPg0KLQkgKiBqYXZhLmlvLlNlcmlhbGl6YmxlPGJyPg0KLQkgKiBqYXZhLmxhbmcuQ2xvbmFibGU8YnI+DQotCSAqIGphdmEubGFuZy5Db21wYXJhYmxlPGJyPg0KLQkgKiA8L3VsPg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUNCi0JICogQHRocm93cyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja011bHRpcGxlSW5oZXJpdGFuY2UoVHlwZUFkYXB0ZXIgdHlwZSkgdGhyb3dzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlMaXN0PFN0cmluZz4gaW50ZXJmYWNlTmFtZXMgPSB0eXBlLmdldEludGVyZmFjZU5hbWVzKCk7DQotCQlmaW5hbCBTdHJpbmcgc3VwZXJDbGFzc05hbWUgPSB0eXBlLmdldFN1cGVyQ2xhc3NOYW1lKCk7DQotCQlpZiAoc3VwZXJDbGFzc05hbWUgPT0gbnVsbCB8fCBzdXBlckNsYXNzTmFtZS5lcXVhbHMoR2VuZXJhbFR5cGVzTmFtZXMuSkFWQV9MQU5HX09CSkVDVCkNCi0JCQkJCQkJCQkJfHwgc3VwZXJDbGFzc05hbWUuZXF1YWxzKEdlbmVyYWxUeXBlc05hbWVzLkpBVkFfTEFOR19FWENFUFRJT04pKQ0KLQkJew0KLQkJCWlmICghY2hlY2tJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbkNvdW50KGludGVyZmFjZU5hbWVzLCAxKSkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBNdWx0aXBsZUltcGxlbWVudGF0aW9uRXhjZXB0aW9uKHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLCBpbnRlcmZhY2VOYW1lcy5nZXQoMCksIGludGVyZmFjZU5hbWVzLmdldCgxKSk7DQotCQkJfQ0KLQkJfSBlbHNlDQotCQl7DQotCQkJaWYgKCFjaGVja0ludGVyZmFjZUltcGxlbWVudGF0aW9uQ291bnQoaW50ZXJmYWNlTmFtZXMsIDApKQ0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IEluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb24odHlwZS5nZXRRdWFsaWZpZWROYW1lKCksIHN1cGVyQ2xhc3NOYW1lKTsNCi0JCQl9DQotDQotCQkJY2hlY2tNdWx0aXBsZUluaGVyaXRhbmNlKHR5cGUuZ2V0U3VwZXJDbGFzc1R5cGUoKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyBpZiA8Y29kZT5pbnRlcmZhY2VOYW1lczwvY29kZT4gYXJlIG1vcmUgdGhhbiA8Y29kZT5tYXhBbGxvd2VkPC9jb2RlPiBpbnRlcmZhY2VzLiBOb3RlOiBUaGUgZm9sbG93aW5nIGludGVyZmFjZXMgYXJlIHNraXBwZWQgZnJvbQ0KLQkgKiBjaGVjazo8YnI+DQotCSAqIDx1bD4NCi0JICogamF2YS5pby5TZXJpYWxpemJsZTxicj4NCi0JICogamF2YS5sYW5nLkNsb25hYmxlPGJyPg0KLQkgKiBqYXZhLmxhbmcuQ29tcGFyYWJsZTxicj4NCi0JICogPC91bD4NCi0JICogDQotCSAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lcw0KLQkgKiBAcGFyYW0gbWF4QWxsb3dlZCAtDQotCSAqICAgICAgICAgICAgbnVtYmVyIG9mIG1heGltdW0gYWxsb3dlZCBpbXBsZW1lbnRhdGlvbnMNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Db3VudChMaXN0PFN0cmluZz4gaW50ZXJmYWNlTmFtZXMsIGludCBtYXhBbGxvd2VkKQ0KLQl7DQotCQlpZiAoaW50ZXJmYWNlTmFtZXMgPT0gbnVsbCB8fCBpbnRlcmZhY2VOYW1lcy5zaXplKCkgPT0gMCkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0NCi0JCWludCBub25lQWxsb3dlZEludGVyZmFjZUNvdW50ID0gMDsNCi0JCWZvciAoU3RyaW5nIGludGVyZmFjZU5hbWUgOiBpbnRlcmZhY2VOYW1lcykNCi0JCXsNCi0JCQlpZiAoQUxMT1dFRF9JTl9NVUxUWUlOSEVSSVRBTkNFLmNvbnRhaW5zKGludGVyZmFjZU5hbWUpKQ0KLQkJCXsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQ0KLQkJCW5vbmVBbGxvd2VkSW50ZXJmYWNlQ291bnQrKzsNCi0JCQlpZiAobm9uZUFsbG93ZWRJbnRlcmZhY2VDb3VudCA+IG1heEFsbG93ZWQpDQotCQkJew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEluYWRtaXNzYWJsZSBhcmUgbWVtYmVyIGNsYXNzZXMgdGhhdCBhcmUgbm90ICJwdWJsaWMgc3RhdGljIi4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEB0aHJvd3MgSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvckluYWRtaXNzYWJsZUlubmVyQ2xhc3NlcyhUeXBlQWRhcHRlciB0eXBlKSB0aHJvd3MgSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHR5cGUuaGFzTm9uU3RhdGljT3JOb25QdWJsaWNJbm5lclR5cGVzKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IEhhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbih0eXBlLmdldFF1YWxpZmllZE5hbWUoKSk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9BYnN0cmFjdENsYXNzTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQwNGM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9BYnN0cmFjdENsYXNzTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9uczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotLyoqDQotICogRXhjZXB0aW9uIHVzZWQgd2hlbiBhIFJUIGNsYXNzIGlzIGFic3RyYWN0IGFuZCBpcyBub3QgaW1wbGVtZW50ZWQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdENsYXNzTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gZXh0ZW5kcyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTg3MTQ1ODMyOTA2ODk2NjU4MUw7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gY2xhc3NGUU5hbWUNCi0JICovDQotCXB1YmxpYyBBYnN0cmFjdENsYXNzTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oU3RyaW5nIGNsYXNzRlFOYW1lKQ0KLQl7DQotCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdCgiQWJzdHJhY3QgY2xhc3MgezB9IGNhbm5vdCBiZSB1c2VkIGFzIHJ1bnRpbWUgY2xhc3MgYmVjYXVzZSBpdCBpcyBub3QgZXh0ZW5kZWQgYnkgbm9uIGFic3RyYWN0IGNsYXNzIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBhIHJ1bnRpbWUgY2xhc3MiLCBjbGFzc0ZRTmFtZSksIC8vJE5PTi1OTFMtMSQNCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2UsIGNsYXNzRlFOYW1lKSk7DQotCQkNCi0JCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0NvbnN0cnVjdG9yTm90RXhwb3NhYmxlRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9Db25zdHJ1Y3Rvck5vdEV4cG9zYWJsZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzU4YmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0NvbnN0cnVjdG9yTm90RXhwb3NhYmxlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB1c2VkIHRvIGRlc2NyaWJlIHRoYXQgdGhlIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBleHBvc2VkIGluIFdTLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb24gZXh0ZW5kcyBNZXRob2ROb3RFeHBvc2FibGVFeGNlcHRpb24NCi17DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ1MDQ3NDI4MjQ0OTUwNTc5NTZMOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSBtZXRob2ROYW1lDQotCSAqLw0KLQlwdWJsaWMgQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb24oU3RyaW5nIG1ldGhvZE5hbWUpDQotCXsNCi0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJDb25zdHJ1Y3RvciB7MH0gY2Fubm90IGJlIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2Ugb3BlcmF0aW9uIiwgbWV0aG9kTmFtZSksIC8vJE5PTi1OTFMtMSQNCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuQ29uc3RydWN0b3JOb3RFeHBvc2FibGVFeGNlcHRpb25fRXJyb3JfTWVzc2FnZSwgbWV0aG9kTmFtZSkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0hhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMWMzNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB1c2VkIGluIGNhc2Ugd2hlbiBhbiBSVCBjbGFzcyBjb250YWlucyBpbm5lciBjbGFzcyB0aGF0IGRvZXMgbm90IGZ1bGZpbCB0aGUgcmVxdWlyZW1lbnRzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uIGV4dGVuZHMgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLXsNCi0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IuIENyZWF0ZXMgbWVhbmluZ2Z1bGwgbWVzc2FnZSB1c2luZyA8dHQ+Y2xhc3NOYW1lPC90dD4NCi0JICogDQotCSAqIEBwYXJhbSBjbGFzc05hbWUNCi0JICovDQotCXB1YmxpYyBIYXNJbmFkbWlzYWJsZUlubmVyVHlwZXNFeGNlcHRpb24oU3RyaW5nIGNsYXNzTmFtZSkNCi0Jew0KLQkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoIkNsYXNzIHswfSBoYXMgaW5uZXIgdHlwZXMgdGhhdCBhcmUgbm90IHB1YmxpYyBhbmQgc3RhdGljIiwgY2xhc3NOYW1lKSAvLyROT04tTkxTLTEkDQotCQkJCSwNCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2UsIGNsYXNzTmFtZSkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0luYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0luYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDY0ODIzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9JbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnM7DQotDQotLyoqDQotICogQWJzdHJhY3QgY2xhc3MgZm9yIGV4Y2VwdGlvbnMgaW4gdHlwZSB2YWxpZGF0aW9uLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLQlmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIHJlYXNvbiAtDQotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc2FnZQ0KLQkgKi8NCi0JcHVibGljIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpDQotCXsNCi0JCXN1cGVyKHJlYXNvbik7DQotCQl0aGlzLmxvY2FsaXplZE1lc3NhZ2UgPSBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7DQotCQlyZXR1cm4gbG9jYWxpemVkTWVzc2FnZTsNCi0JfQ0KLQkNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0luaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0luaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTk5ZTRhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9Jbmhlcml0YW5jZUFuZEltcGxlbWVudGF0aW9uRXhlY3B0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB1c2VkIGluIFJUIHZhbGlkYXRpb24gd2hlbiBhbiBSVCBjbGFzcyBoYXMgbXVsdHkgaW5oZXJpdGFuY2UgdmlhIGV4dGVudGlvbiBhbmQgaW1wbGVtZW50YXRpb24uDQotICovDQotcHVibGljIGNsYXNzIEluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb24gZXh0ZW5kcyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotew0KLQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gY2xhc3NOYW1lDQotCSAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lDQotCSAqLw0KLQlwdWJsaWMgSW5oZXJpdGFuY2VBbmRJbXBsZW1lbnRhdGlvbkV4ZWNwdGlvbihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkNCi0Jew0KLQkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoIkNsYXNzIHswfSBleHRlbmRzIHsxfSBhbmQgaW1wbGVtZW50cyBjdXN0b20gaW50ZXJmYWNlIChtdWx0aXBsZSBpbmhlcml0YW5jZSBpcyBub3QgYWxsb3dlZCkiLCBjbGFzc05hbWUsIGludGVyZmFjZU5hbWUpLCAvLyROT04tTkxTLTEkDQotCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLkluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb25fRXJyb3JfTWVzc2FnZSwgY2xhc3NOYW1lLCBpbnRlcmZhY2VOYW1lKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvSW50ZXJmYWNlc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvSW50ZXJmYWNlc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjcwYzRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL0ludGVyZmFjZXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9uczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotLyoqDQotICogRXhjZXB0aW9uIHVzZWQgd2hlbiBhbiBpbnRlcmZhY2UgaXMgdXNlZCBhcyBSVCBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEludGVyZmFjZXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdGlvbi4NCi0JICogDQotCSAqIEBwYXJhbSBpbnRlcmZhY2VGUU5hbWUNCi0JICovDQotCXB1YmxpYyBJbnRlcmZhY2VzTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBpbnRlcmZhY2VGUU5hbWUpDQotCXsNCi0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJ7MH0gaXMgYSBpbnRlcmZhY2UsIGFuZCBKQVhCIGNhbm5vdCBoYW5kbGUgaW50ZXJmYWNlcyIsIGludGVyZmFjZUZRTmFtZSksIC8vJE5PTi1OTFMtMSQNCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuSW50ZXJmYWNlc05vdFN1cHBvcnRlZEV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlLCBpbnRlcmZhY2VGUU5hbWUpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9NZXRob2ROb3RFeHBvc2FibGVFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL01ldGhvZE5vdEV4cG9zYWJsZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOWJhNjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL01ldGhvZE5vdEV4cG9zYWJsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB1c2VkIHdoZW4gYSBtZXRob2QgY2Fubm90IGJlIGV4cG9zZWQgYXMgV1MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNZXRob2ROb3RFeHBvc2FibGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MDY2NDE1ODU0NDEwOTA5NjZMOw0KLQ0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbG9jYWxpemVkTWVzc2FnZQ0KLQkgKi8NCi0JcHVibGljIE1ldGhvZE5vdEV4cG9zYWJsZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpIHsNCi0JCXN1cGVyKG1lc3NhZ2UpOw0KLQkJdGhpcy5sb2NhbGl6ZWRNZXNzYWdlID0gbG9jYWxpemVkTWVzc2FnZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgbG9jYWxpemVkIG1lc3NhZ2Ugb2YgZXhjZXB0aW9uIA0KLQkgKiAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgew0KLQkJcmV0dXJuIGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvTWV0aG9kTm90UHVibGljRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9NZXRob2ROb3RQdWJsaWNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmY1NTA0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9NZXRob2ROb3RQdWJsaWNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9uczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotLyoqDQotICogVXNlZCB3aGVuIGFuIG1ldGhvZCBpcyBub3QgcHVibGljIGFuZCB0aGF0IGlzIHdoeSBpdCBjYW5ub3QgYmUgZXhwb3NlZCBhcyBXUy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZE5vdFB1YmxpY0V4Y2VwdGlvbiBleHRlbmRzIE1ldGhvZE5vdEV4cG9zYWJsZUV4Y2VwdGlvbg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ3OTIzNDIxODc2OTg1NTg2ODdMOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWV0aG9kTmFtZQ0KLQkgKi8NCi0JcHVibGljIE1ldGhvZE5vdFB1YmxpY0V4Y2VwdGlvbihTdHJpbmcgbWV0aG9kTmFtZSkNCi0Jew0KLQkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoIk1ldGhvZCB7MH0gaXMgbm90IHB1YmxpYyBhbmQgY2Fubm90IGJlIGV4cG9zZWQgYXMgYSB3ZWIgc2VydmljZSBvcGVyYXRpb24iLCBtZXRob2ROYW1lKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5NZXRob2ROb3RQdWJsaWNFeGNlcHRpb25fRXJyb3JfTWVzc2FnZSAsIG1ldGhvZE5hbWUpKTsgDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvTXVsdGlwbGVJbXBsZW1lbnRhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvTXVsdGlwbGVJbXBsZW1lbnRhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYWY3NTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL011bHRpcGxlSW1wbGVtZW50YXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9uczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotLyoqDQotICogRXhjZXB0aW9uIHVzZWQgaW4gY2FzZSBSVCBjbGFzcyBpbXBsZW1lbnRzIG1vcmUgdGhhdCAxIGludGVyZmFjZSB3aWNoIGlzIG5vdCBhbGxvd2VkLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTXVsdGlwbGVJbXBsZW1lbnRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24NCi17DQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVzdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIGNsYXNzTmFtZSAtDQotCSAqICAgICAgICAgICAgUlQgY2xhc3MgbmFtZQ0KLQkgKiBAcGFyYW0gaW50ZXJmYWNlMSAtDQotCSAqICAgICAgICAgICAgaW1wbGVtZW50ZWQgaW50ZXJmYWNlIDENCi0JICogQHBhcmFtIGludGVyZmFjZTIgLQ0KLQkgKiAgICAgICAgICAgIGltcGxlbWVudGVkIGludGVyZmFjZSAyDQotCSAqLw0KLQlwdWJsaWMgTXVsdGlwbGVJbXBsZW1lbnRhdGlvbkV4Y2VwdGlvbihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgaW50ZXJmYWNlMSwgU3RyaW5nIGludGVyZmFjZTIpDQotCXsNCi0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJDbGFzcyB7MH0gaW1wbGVtZW50cyBib3RoIGludGVyZmFjZSB7MX0gYW5kIGludGVyZmFjZSB7Mn0gKG11bHRpcGxlIGluaGVyaXRhbmNlIGlzIG5vdCBhbGxvd2VkKSIsIGNsYXNzTmFtZSwgaW50ZXJmYWNlMSwgaW50ZXJmYWNlMiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuTXVsdGlwbGVJbXBsZW1lbnRhdGlvbkV4Y2VwdGlvbl9FcnJvcl9NZXNzYWdlLCBjbGFzc05hbWUsIGludGVyZmFjZTEsIGludGVyZmFjZTIpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9Ob0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2ZiZTBkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9Ob0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gZm9yIFJUIGNsYXNzIHdoZW4gdGhlcmUgaXMgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvciBpbiBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE5vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uIGV4dGVuZHMgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbg0KLXsNCi0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZSAtDQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgUlQgY2xhc3MNCi0JICovDQotCXB1YmxpYyBOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbihTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJDbGFzcyB7MH0gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IiLCB0eXBlTmFtZSksIC8vJE5PTi1OTFMtMSQNCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuRW5kcG9pbnRUeXBlVmFsaWRhdG9yX0VSUl9NU0dfQ09OU1RSVUNUT1IsIHR5cGVOYW1lKSk7DQotCQkNCi0JCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9wcm92aWRlci9leGNlcHRpb25zL1JlbW90ZU9iamVjdEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvUmVtb3RlT2JqZWN0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhNmNhMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvUmVtb3RlT2JqZWN0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB3aWNoIGlzIHVzZWQgdG8gZGVmaW5lIHRoYXQgdGhlIFJUIGNsYXNzIGltcGxlbWVudHMgamF2YS5ybWkuUmVtb3RlDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZW1vdGVPYmplY3RFeGNlcHRpb24gZXh0ZW5kcyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotew0KLQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvci4NCi0JICogDQotCSAqIEBwYXJhbSBjbGFzc05hbWUgLQ0KLQkgKiAgICAgICAgICAgIFJUIGNsYXNzDQotCSAqLw0KLQlwdWJsaWMgUmVtb3RlT2JqZWN0RXhjZXB0aW9uKFN0cmluZyBjbGFzc05hbWUpDQotCXsNCi0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJDbGFzcyB7MH0gaXMgYSByZW1vdGUgT2JqZWN0IiwgY2xhc3NOYW1lKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5SZW1vdGVPYmplY3RFeGNlcHRpb25fRXJyb3JfTWVzc2FnZSwgY2xhc3NOYW1lKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3Byb3ZpZGVyL2V4Y2VwdGlvbnMvVHlwZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9UeXBlTm90Rm91bmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzhmOGM5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vcHJvdmlkZXIvZXhjZXB0aW9ucy9UeXBlTm90Rm91bmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9uczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotLyoqDQotICogQ2xhc3MgdXNlZCB3aGVuIHR5cGUgaXMgc2VhcmNoZWQgdG8gZGVmaW5lIHRoYXQgdGhlIGNsYXNzIHdhcyBub3QgZm91bmQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUeXBlTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBJbmFkbWlzc2FibGVUeXBlRXhjZXB0aW9uDQotew0KLQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvci4NCi0JICogDQotCSAqIEBwYXJhbSBjbGFzc05hbWUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGlzIG5vdCBmb3VuZA0KLQkgKi8NCi0JcHVibGljIFR5cGVOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgY2xhc3NOYW1lKQ0KLQl7DQotCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdCgiQ2xhc3MgezB9IGNhbm5vdCBiZSBmb3VuZCIsIGNsYXNzTmFtZSksIC8vJE5PTi1OTFMtMSQNCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuVHlwZU5vdEZvdW5kRXhjZXB0aW9uX0Vycm9yX01lc3NhZ2UsIGNsYXNzTmFtZSkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvUmVkdW5kYW50QXR0cmlidXRlc0NvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvUmVkdW5kYW50QXR0cmlidXRlc0NvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDc3NWMzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1JlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnNlaTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5FTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlBPUlRfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuU0VSVklDRV9OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU0RMX0xPQ0FUSU9OX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgV2ViU2VydmljZSBhbm5vdGF0aW9uIHNldCBvbiBTRUkgY29udGFpbnMgcG9ydE5hbWUsIHNlcnZpY2VOYW1lIG9yIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZXMuDQotICogQWNjb3JkaW5nIHRvIGpzdC0xODEsIHBvaW50IDMuMiBzdWItcG9pbnQgNiB0aGlzIGlzIG5vdCBhbGxvd2VkLiAgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZWR1bmRhbnRBdHRyaWJ1dGVzQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBbXSBSRURVTkRBTlRfQVRUUklCVVRFUyA9IHtQT1JUX05BTUVfQVRUUklCVVRFLCBTRVJWSUNFX05BTUVfQVRUUklCVVRFLCBFTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFLCBXU0RMX0xPQ0FUSU9OX0FUVFJJQlVURX07IA0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIFJlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFNlaUNvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSljdHguZ2V0VGFyZ2V0KCk7DQotCQlpZiAoc2VpLmlzSW1wbGljaXQoKSkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyhzZWkpOw0KLQkJfQ0KLQkJDQotCQlpZiAoY29udGFpbnNSZWR1bmRhbnRBdHRyaWJ1dGUoc2VpKSkgew0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMoc2VpLCBWYWxpZGF0aW9uTWVzc2FnZXMuU2VpVmFsaWRhdGlvbl9SZWR1bmRhbnRBdHRyaWJ1dGVzLCBXU19BTk5PVEFUSU9OLCBudWxsKTsNCi0JCX0JDQotDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMoc2VpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNSZWR1bmRhbnRBdHRyaWJ1dGUoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBmaW5kQW5ub3RhdGlvbihzZWksIFdTX0FOTk9UQVRJT04pOw0KLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJZm9yIChTdHJpbmcgcmVkdW5kYW50QXR0cmlidXRlIDogUkVEVU5EQU5UX0FUVFJJQlVURVMpIHsNCi0JCQlpZiAoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKHJlZHVuZGFudEF0dHJpYnV0ZSkhPW51bGwpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlDbGFzc0NvcnJlY3RDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1NlaUNsYXNzQ29ycmVjdENvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGRmODQ3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1NlaUNsYXNzQ29ycmVjdENvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uc2VpOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tMlJlc291cmNlTWFwcGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5TZWlWYWxpZGF0b3I7DQotDQotLyoqDQotICogQ2hlY2tzIHRoZSBTRUkgdW5kZXJsaW5nIGludGVyZmFjZSBpZiBpcyBjYXBhYmxlIHRvIGJlIHVzZWQgYXMgU0VJIGFjY29yZGluZyB0byAgDQotICoganNyLTE4MSBwb2ludCAzLjINCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaUNsYXNzQ29ycmVjdENvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgU2VpQ2xhc3NDb3JyZWN0Q29uc3RyYWludCgpIA0KLQl7DQotCQlzdXBlcihuZXcgU2VpQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTZWlWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNlaVZhbGlkYXRvcigpOw0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSljdHguZ2V0VGFyZ2V0KCk7DQotCQlpZiAoc2VpLmlzSW1wbGljaXQoKSkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyhzZWkpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJVHlwZSBzZWlUeXBlID0gRG9tMlJlc291cmNlTWFwcGVyLklOU1RBTkNFLmZpbmRUeXBlKHNlaSk7DQotCQlpZiAoc2VpVHlwZSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHNlaSk7DQotCQl9DQotCQkNCi0JCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLnZhbGlkYXRlKHNlaVR5cGUpOw0KLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzZWksIHN0YXR1cy5nZXRNZXNzYWdlKCksIFdTX0FOTk9UQVRJT04sIG51bGwpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMoc2VpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1NlaUNvbnN0cmFpbnREZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1NlaUNvbnN0cmFpbnREZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlYjNkZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlDb25zdHJhaW50RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5zZWk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkNvbnN0cmFpbnRTZXZlcml0eTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdGFudHM7DQotDQotLyoqDQotICogVGhlIGNvbnN0cmFpbnQgZGVzY3JpcHRvciBmb3IgU0VJIHZhbGlkYXRpb24gY29uc3RyYWludHMNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotY2xhc3MgU2VpQ29uc3RyYWludERlc2NyaXB0b3IgZXh0ZW5kcyBEb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3INCi17DQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7DQotCQlyZXR1cm4gRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5TRUlfQ09OU1RSQUlOVF9JRDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgew0KLQkJcmV0dXJuIEpheFdzRG9tUnVudGltZVBsdWdpbi5QTFVHSU5fSUQ7DQotCX0NCi0NCi0JcHVibGljIENvbnN0cmFpbnRTZXZlcml0eSBnZXRTZXZlcml0eSgpIHsNCi0JCXJldHVybiBDb25zdHJhaW50U2V2ZXJpdHkuRVJST1I7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgew0KLQkJcmV0dXJuIC0yODsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1NlaUNvbnN0cmFpbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlDb25zdHJhaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZjMzYxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vc2VpL1NlaUNvbnN0cmFpbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5zZWk7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuSU1vZGVsQ29uc3RyYWludDsNCi0NCi0vKioNCi0gKiBDb25zdHJhaW50IHByb3ZpZGVyIGZvciBTRUkgRE9NIG9iamVjdHMNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaUNvbnN0cmFpbnRQcm92aWRlciANCi17DQotCXByaXZhdGUgU2V0PElNb2RlbENvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzOw0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gY29uc3RyYWludHMgcmVsYXRlZCB0byBTRUkNCi0JICovDQotCXB1YmxpYyBDb2xsZWN0aW9uPElNb2RlbENvbnN0cmFpbnQ+IGdldENvbnN0cmFpbnRzKCkgDQotCXsNCi0JCWlmIChjb25zdHJhaW50cz09bnVsbCkgDQotCQl7DQotCQkJY29uc3RyYWludHMgPSBuZXcgSGFzaFNldDxJTW9kZWxDb25zdHJhaW50PigpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgU2VpTmFtZUluTkNOYW1lQ29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IFRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgUmVkdW5kYW50QXR0cmlidXRlc0NvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBTZWlDbGFzc0NvcnJlY3RDb25zdHJhaW50KCkpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGNvbnN0cmFpbnRzOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvU2VpTmFtZUluTkNOYW1lQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlOYW1lSW5OQ05hbWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyMjY0MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9TZWlOYW1lSW5OQ05hbWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnNlaTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLldzZGxOYW1lc1ZhbGlkYXRvcjsNCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgJ25hbWUnIGF0dHJpYnV0ZSBpcyB2YWxpZCBOQ05hbWUgIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpTmFtZUluTkNOYW1lQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCXB1YmxpYyBTZWlOYW1lSW5OQ05hbWVDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFNlaUNvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWN0eC5nZXRUYXJnZXQoKTsNCi0JCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gV3NkbE5hbWVzVmFsaWRhdG9yLnZhbGlkYXRlTkNOYW1lMihOQU1FX0FUVFJJQlVURSwgc2VpLmdldE5hbWUoKSk7DQotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHNlaSwgc3RhdHVzLmdldE1lc3NhZ2UoKSwgV1NfQU5OT1RBVElPTiwgTkFNRV9BVFRSSUJVVEUpOw0KLQkJfQkNCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHNlaSk7DQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9UYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3NlaS9UYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjM0NzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi9zZWkvVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uc2VpOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmEubmV0LlVSSTsNCi1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5KYXhXc0RvbVJ1bnRpbWVNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgdGhlICd0YXJnZXROYW1lc29hY2UnIGF0dHJpYnV0ZSBpbiBXZWJTZXJ2aWNlIGFubm90YXRpb24gaXMgdmFsaWQgVVJJIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JcHVibGljIFRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFNlaUNvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpY3R4LmdldFRhcmdldCgpOyANCi0JCXRyeSB7DQotCQkJbmV3IFVSSShzZWkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOw0KLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHNlaSwgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuYmluZCgNCi0JCQkJCQkJCQkJCUpheFdzRG9tUnVudGltZU1lc3NhZ2VzLlRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50X1VSSV9TWU5UQVhfRVJST1IsDQotCQkJCQluZXcgT2JqZWN0W10ge2UuZ2V0SW5kZXgoKSwgZS5nZXRJbnB1dCgpLCBlLmdldFJlYXNvbigpfSksIA0KLQkJCQkJV1NfQU5OT1RBVElPTiwgVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMoc2VpKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL01ldGhvZE5vdEV4Y2x1ZGVkSW5TZWlDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL01ldGhvZE5vdEV4Y2x1ZGVkSW5TZWlDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3ZjBlYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9NZXRob2ROb3RFeGNsdWRlZEluU2VpQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJtZXRob2Q7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fQU5OT1RBVElPTjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlcy5XTV9FWENMVURFRF9BVFRSSUJVVEU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzLlZhbGlkYXRpb25NZXNzYWdlczsNCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgdGhlcmUgaXMgYSA8Yj5leGNsdWRlPXRydWU8L2I+IGF0dHJpYnV0ZSBpbiBXZWJNZXRvZCBhbm5vdGF0aW9uIGluIFNFSS4NCi0gKiBBY2NvcmRpbmcgdG8ganNyLTE4MSBzZWN0aW9uIDQuMi4xIGF0dHJpYnV0ZSA8Yj5leGNsdWRlPC9iPiB0aGlzIGlzIG5vdCBhbGxvd2VkLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kTm90RXhjbHVkZWRJblNlaUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgTWV0aG9kTm90RXhjbHVkZWRJblNlaUNvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgV21Db25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSAoSVdlYk1ldGhvZCljdHguZ2V0VGFyZ2V0KCk7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdtLmVDb250YWluZXIoKTsNCi0JCQ0KLQkJaWYgKHdtLmlzRXhjbHVkZWQoKSAmJiAhc2VpLmlzSW1wbGljaXQoKSkgDQotCQl7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3bSwgVmFsaWRhdGlvbk1lc3NhZ2VzLldlYk1ldGhvZFZhbGlkYXRpb25fTWV0aG9kU2hvdWxkTm90QmVFeGNsdWRlZCwgV01fQU5OT1RBVElPTiwgV01fRVhDTFVERURfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdtKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL05hbWVJc05DTmFtZUNvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvTmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYmU0NTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvTmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJtZXRob2Q7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fQU5OT1RBVElPTjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Xc2RsTmFtZXNWYWxpZGF0b3I7DQotDQotLyoqDQotICogQ2hlY2tzIGlmIDxiPm9wZXJhdGlvbk5hbWU8L2I+IGlzIHZhbGlkIE5DTmFtZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE5hbWVJc05DTmFtZUNvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgTmFtZUlzTkNOYW1lQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXbUNvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3bSA9IChJV2ViTWV0aG9kKWN0eC5nZXRUYXJnZXQoKTsNCi0JCWlmKCF3bS5pc0V4Y2x1ZGVkKCkpIA0KLQkJew0KLQkJCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gV3NkbE5hbWVzVmFsaWRhdG9yLnZhbGlkYXRlTkNOYW1lMihXTV9OQU1FX0FUVFJJQlVURSwgd20uZ2V0TmFtZSgpKTsNCi0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsNCi0JCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3bSwgc3RhdHVzLmdldE1lc3NhZ2UoKSwgV01fQU5OT1RBVElPTiwgV01fTkFNRV9BVFRSSUJVVEUpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdtKTsNCi0JfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL05hbWVJc1VuaXF1ZUNvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvTmFtZUlzVW5pcXVlQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOGM0MjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvTmFtZUlzVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJtZXRob2Q7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fQU5OT1RBVElPTjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlcy5XTV9OQU1FX0FUVFJJQlVURTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ubWVzc2FnZXMuVmFsaWRhdGlvbk1lc3NhZ2VzOw0KLQ0KLS8qKg0KLSAqIENoZWNrcyBpZiB0aGUgPGI+b3BlcmF0aW9uTmFtZTwvYj4gYXR0cmlidXRlIGlzIHVuaXF1ZSBpbiB0aGUgc2NvcGUgb2YNCi0gKiBTRUkgbWV0aG9kcy4gQWNjb3JkaW5nIHRvIFdTREwgc3BlY2lmaWNhdGlvbiBvcGVyYXRpb25zIHNob3VsZCBoYXZlIGRpZmZlcmVudA0KLSAqIG5hbWVzIGUuZy4gb3ZlcmxvYWRpbmcgaXMgbm90IHN1cHBvcnRlZC4gDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBOYW1lSXNVbmlxdWVDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIE5hbWVJc1VuaXF1ZUNvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgV21Db25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKWN0eC5nZXRUYXJnZXQoKTsNCi0JCWlmICghd2ViTWV0aG9kLmlzRXhjbHVkZWQoKSAmJiAhaXNOYW1lVW5pcXVlKHdlYk1ldGhvZCkpIA0KLQkJew0KLQkJCWZpbmFsIFN0cmluZyBtc2cgPSBWYWxpZGF0aW9uTWVzc2FnZXMuYmluZChWYWxpZGF0aW9uTWVzc2FnZXMuV2ViTWV0aG9kVmFsaWRhdGlvbl9OYW1lRXhpc3RzLCB3ZWJNZXRob2QuZ2V0TmFtZSgpKTsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdlYk1ldGhvZCwgbXNnLCBXTV9BTk5PVEFUSU9OLCBXTV9OQU1FX0FUVFJJQlVURSk7DQotCQl9CQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod2ViTWV0aG9kKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYW1lVW5pcXVlKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSANCi0Jew0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSl3ZWJNZXRob2QuZUNvbnRhaW5lcigpOw0KLQkJZm9yKElXZWJNZXRob2Qgd20gOiBzZWkuZ2V0V2ViTWV0aG9kcygpKSANCi0JCXsNCi0JCQlpZiAod209PXdlYk1ldGhvZCB8fCB3bS5pc0V4Y2x1ZGVkKCkpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCWlmICh3bS5nZXROYW1lKCkuZXF1YWxzKHdlYk1ldGhvZC5nZXROYW1lKCkpKSB7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvUmVkdW5kYW50QXR0cmlidXRlc0NvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvUmVkdW5kYW50QXR0cmlidXRlc0NvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM2MzFlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL1JlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYm1ldGhvZDsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlcy5XTV9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzLlZhbGlkYXRpb25NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIENoZWNrIGlmIGluIHtAbGluayBXZWJNZXRob2R9IGFubm90YXRpb24gd2hlcmUgPGI+ZXhjbHVkZT10cnVlPC9iPiBubyBvdGhlciBhdHRyaWJ1dGVzDQotICogYXJlIHVzZWQuIEFjY29yZGluZyB0byBqc3ItMTgxIC0gcG9pbnQgNC4yLjEsIGV4Y2x1ZGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uIHRoaXMgaXMgbm90DQotICogYWxsb3dlZC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFJlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIFJlZHVuZGFudEF0dHJpYnV0ZXNDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFdtQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCljdHguZ2V0VGFyZ2V0KCk7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYk1ldGhvZC5lQ29udGFpbmVyKCk7DQotCQkNCi0JCS8vIGlmIHRoZSBtZXRob2QgaXMgbm90IGV4Y2x1ZGVkIHdlIGRvIG5vdCBuZWVkIHRoaXMgY2hlY2sNCi0JCWlmICghd2ViTWV0aG9kLmlzRXhjbHVkZWQoKSB8fCAhc2VpLmlzSW1wbGljaXQoKSkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3ZWJNZXRob2QpOw0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRhaW5zT3RoZXJBdHRyaWJ1dGVzKHdlYk1ldGhvZCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdlYk1ldGhvZCwgVmFsaWRhdGlvbk1lc3NhZ2VzLldlYk1ldGhvZFZhbGlkYXRpb25fRXhjbHVkZWRIYXNPdGhlckF0dHJpYnV0ZXMsIFdNX0FOTk9UQVRJT04sIG51bGwpOw0KLQkJfQkJDQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3ZWJNZXRob2QpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc090aGVyQXR0cmlidXRlcyhmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkgDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBqZWU1RG9tVXRpbCgpLmZpbmRBbm5vdGF0aW9uKHdlYk1ldGhvZCwgV01fQU5OT1RBVElPTik7DQotCQlpZiAoYW5ub3RhdGlvbj09bnVsbCkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID4gMSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9XbUNvbnN0cmFpbnREZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL1dtQ29uc3RyYWludERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWE1MDM3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VibWV0aG9kL1dtQ29uc3RyYWludERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2VibWV0aG9kOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5Db25zdHJhaW50U2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RhbnRzOw0KLQ0KLWNsYXNzIFdtQ29uc3RyYWludERlc2NyaXB0b3IgZXh0ZW5kcyBEb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3INCi17CQ0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KLQkJcmV0dXJuIERvbVZhbGlkYXRpb25Db25zdGFudHMuV01fQ09OU1RSQUlOVF9JRDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgew0KLQkJcmV0dXJuIEpheFdzRG9tUnVudGltZVBsdWdpbi5QTFVHSU5fSUQ7DQotCX0NCi0NCi0JcHVibGljIENvbnN0cmFpbnRTZXZlcml0eSBnZXRTZXZlcml0eSgpIHsNCi0JCXJldHVybiBDb25zdHJhaW50U2V2ZXJpdHkuRVJST1I7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgew0KLQkJcmV0dXJuIC0yNzsNCi0JfQkNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9XbUNvbnN0cmFpbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYm1ldGhvZC9XbUNvbnN0cmFpbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYWM5MzM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJtZXRob2QvV21Db25zdHJhaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2VibWV0aG9kOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklNb2RlbENvbnN0cmFpbnQ7DQotDQotcHVibGljIGNsYXNzIFdtQ29uc3RyYWludFByb3ZpZGVyIA0KLXsNCi0JcHJpdmF0ZSBTZXQ8SU1vZGVsQ29uc3RyYWludD4gY29uc3RyYWludHM7Ow0KLQkNCi0JcHVibGljIENvbGxlY3Rpb248SU1vZGVsQ29uc3RyYWludD4gZ2V0Q29uc3RyYWludHMoKSANCi0Jew0KLQkJaWYgKGNvbnN0cmFpbnRzID09IG51bGwpIA0KLQkJew0KLQkJCWNvbnN0cmFpbnRzID0gbmV3IEhhc2hTZXQ8SU1vZGVsQ29uc3RyYWludD4oKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IE5hbWVJc05DTmFtZUNvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBOYW1lSXNVbmlxdWVDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgUmVkdW5kYW50QXR0cmlidXRlc0NvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBNZXRob2ROb3RFeGNsdWRlZEluU2VpQ29uc3RyYWludCgpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNvbnN0cmFpbnRzOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9OYW1lSXNOQ05hbWVDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzNjMWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9OYW1lSXNOQ05hbWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnBhcmFtOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuSmVlNURvbVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuV3NkbE5hbWVzVmFsaWRhdG9yOw0KLQ0KLS8qKg0KLSAqIENoZWNrIGlmIG5hbWUgYXR0cmlidXRlIG9mIHtAbGluayBXZWJQYXJhbX0gYW5ub3RhdGlvbiBpcyBjb3JyZWN0IE5DTmFtZS4gIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmFtZUlzTkNOYW1lQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk4gPSAicmV0dXJuIjsvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBOYW1lSXNOQ05hbWVDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFdwQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWN0eC5nZXRUYXJnZXQoKTsNCi0JCWlmIChSRVRVUk4uZXF1YWxzKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpIHx8ICFpc05hbWVVc2VkKHdlYlBhcmFtKSkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3ZWJQYXJhbSk7DQotCQl9DQotCQkNCi0JCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gV3NkbE5hbWVzVmFsaWRhdG9yLnZhbGlkYXRlTkNOYW1lMihOQU1FX0FUVFJJQlVURSwgd2ViUGFyYW0uZ2V0TmFtZSgpKTsNCi0JCWlmICghc3RhdHVzLmlzT0soKSkgew0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMod2ViUGFyYW0sIHN0YXR1cy5nZXRNZXNzYWdlKCksIFdQX0FOTk9UQVRJT04sIE5BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdlYlBhcmFtKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYW1lVXNlZChmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pDQotCXsNCi0JCXJldHVybiBKZWU1RG9tVXRpbHMuZ2V0SW5zdGFuY2UoKS5pc05hbWVVc2VkKHdlYlBhcmFtKTsNCi0JfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzUmVkdW5kYW50Q29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL05hbWVJc1JlZHVuZGFudENvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQ4YjBhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzUmVkdW5kYW50Q29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJwYXJhbTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkNvbnN0cmFpbnRTZXZlcml0eTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkplZTVEb21VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ubWVzc2FnZXMuVmFsaWRhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotLyoqDQotICogQ2hlY2sgaWYgbmFtZSBhdHRyaWJ1dGUgb2Yge0BsaW5rIFdlYlBhcmFtfSBhbm5vdGF0aW9uIGlzIHJlZHVuZGFudC4gDQotICogU2VlIHtAbGluayBKZWU1RG9tVXRpbHMjaXNOYW1lVXNlZChJV2ViUGFyYW0pfS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE5hbWVJc1JlZHVuZGFudENvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOID0gInJldHVybiI7Ly8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgTmFtZUlzUmVkdW5kYW50Q29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBOYW1lUmVkdW5kYW50Q29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWN0eC5nZXRUYXJnZXQoKTsNCi0JCWlmIChSRVRVUk4uZXF1YWxzKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdlYlBhcmFtKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGplZTVEb21VdGlsKCkuZmluZEFubm90YXRpb24od2ViUGFyYW0sIFdQX0FOTk9UQVRJT04pOw0KLQkJaWYgKGFubm90YXRpb24hPW51bGwgJiYgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdQQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFKSE9bnVsbCkgDQotCQl7DQotCQkJaWYgKCFqZWU1RG9tVXRpbCgpLmlzTmFtZVVzZWQod2ViUGFyYW0pKSB7DQotCQkJCXJldHVybiBjcmVhdGVTdGF0dXMod2ViUGFyYW0sIFZhbGlkYXRpb25NZXNzYWdlcy5XZWJQYXJhbVZhbGlkYXRpb25fTmFtZVJlZHVuZGFudCwgV1BfQU5OT1RBVElPTiwgTkFNRV9BVFRSSUJVVEUpOwkJCQkNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3ZWJQYXJhbSk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmFtZVJlZHVuZGFudENvbnN0cmFpbnREZXNjcmlwdG9yIGV4dGVuZHMgV3BDb25zdHJhaW50RGVzY3JpcHRvcg0KLQl7DQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBDb25zdHJhaW50U2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKSB7DQotCQkJcmV0dXJuIENvbnN0cmFpbnRTZXZlcml0eS5XQVJOSU5HOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9OYW1lSXNSZXF1aXJlZENvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9OYW1lSXNSZXF1aXJlZENvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzg2NmI1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzUmVxdWlyZWRDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnBhcmFtOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5KZWU1RG9tVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzLlZhbGlkYXRpb25NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIENoZWNrIGlmIG5hbWUgYXR0cmlidXRlIG9mIHtAbGluayBXZWJQYXJhbX0gYW5ub3RhdGlvbiBpcyByZXF1aXJlZC4NCi0gKiBTZWUge0BsaW5rIEplZTVEb21VdGlscyNpc05hbWVSZXF1aXJlZChJV2ViUGFyYW0pfSBmb3IgbW9yZSBkZXRhaWxzLiAgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBOYW1lSXNSZXF1aXJlZENvbnN0cmFpbnQgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTiA9ICJyZXR1cm4iOy8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIE5hbWVJc1JlcXVpcmVkQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXcENvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtID0gKElXZWJQYXJhbSljdHguZ2V0VGFyZ2V0KCk7DQotCQlpZiAoUkVUVVJOLmVxdWFscyh3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3ZWJQYXJhbSk7DQotCQl9DQotDQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gamVlNURvbVV0aWwoKS5maW5kQW5ub3RhdGlvbih3ZWJQYXJhbSwgV1BfQU5OT1RBVElPTik7DQotCQlpZiAoYW5ub3RhdGlvbj09bnVsbCkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3ZWJQYXJhbSk7DQotCQl9DQotCQkNCi0JCWlmIChqZWU1RG9tVXRpbCgpLmlzTmFtZVJlcXVpcmVkKHdlYlBhcmFtKSAmJiBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoTkFNRV9BVFRSSUJVVEUpPT1udWxsKSB7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3ZWJQYXJhbSwgVmFsaWRhdGlvbk1lc3NhZ2VzLldlYlBhcmFtVmFsaWRhdGlvbl9OYW1lUmVxdWlyZWQsIFdQX0FOTk9UQVRJT04sIG51bGwpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod2ViUGFyYW0pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9OYW1lSXNVbmlxdWVDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vTmFtZUlzVW5pcXVlQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDc4NTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9OYW1lSXNVbmlxdWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnBhcmFtOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXM7DQotDQotLyoqDQotICogQ2hlY2sgaWYgbmFtZSBhdHRyaWJ1dGUgb2Yge0BsaW5rIFdlYlBhcmFtfSBhbm5vdGF0aW9uIGlzIHVuaXF1ZSBpbiB0aGUgc2NvcGUgb2YNCi0gKiB0aGUgbWV0aG9kLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmFtZUlzVW5pcXVlQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk4gPSAicmV0dXJuIjsvLyROT04tTkxTLTEkDQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgTmFtZUlzVW5pcXVlQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXcENvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSA9IChJV2ViUGFyYW0pY3R4LmdldFRhcmdldCgpOw0KLQkJaWYgKFJFVFVSTi5lcXVhbHMod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod2ViUGFyYW0pOw0KLQkJfQ0KLQkJCQ0KLQkJaWYgKCFpc05hbWVVbmlxdWUod2ViUGFyYW0pKSANCi0JCXsNCi0JCQlmaW5hbCBTdHJpbmcgbXNnID0gVmFsaWRhdGlvbk1lc3NhZ2VzLmJpbmQoVmFsaWRhdGlvbk1lc3NhZ2VzLldlYlBhcmFtVmFsaWRhdGlvbl9OYW1lRXhpc3RzLCB3ZWJQYXJhbS5nZXROYW1lKCkpOw0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMod2ViUGFyYW0sIG1zZywgV1BfQU5OT1RBVElPTiwgTkFNRV9BVFRSSUJVVEUpOw0KLQkJfQkNCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdlYlBhcmFtKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYW1lVW5pcXVlKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkgDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJZm9yIChJV2ViUGFyYW0gd3AgOiB3ZWJNZXRob2QuZ2V0UGFyYW1ldGVycygpKSANCi0JCXsNCi0JCQlpZiAod3A9PXdlYlBhcmFtKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlpZiAod3AuZ2V0TmFtZSgpLmVxdWFscyh3ZWJQYXJhbS5nZXROYW1lKCkpKSB7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9QYXJ0TmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL1BhcnROYW1lSXNOQ05hbWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmZjQ4NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnBhcmFtL1BhcnROYW1lSXNOQ05hbWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnBhcmFtOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLlBBUlRfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5KZWU1RG9tVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Xc2RsTmFtZXNWYWxpZGF0b3I7DQotDQotLyoqDQotICogQ2hlY2sgaWYgcGFydE5hbWUgYXR0cmlidXRlIG9mIHtAbGluayBXZWJQYXJhbX0gYW5ub3RhdGlvbiBpcyBjb3JyZWN0IE5DTmFtZS4gIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFydE5hbWVJc05DTmFtZUNvbnN0cmFpbnQgIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTiA9ICJyZXR1cm4iOy8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIFBhcnROYW1lSXNOQ05hbWVDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFdwQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWN0eC5nZXRUYXJnZXQoKTsNCi0JCWlmIChSRVRVUk4uZXF1YWxzKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpIHx8ICFKZWU1RG9tVXRpbHMuZ2V0SW5zdGFuY2UoKS5pc1BhcnROYW1lVXNlZCh3ZWJQYXJhbSkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod2ViUGFyYW0pOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJU3RhdHVzIHN0YXR1cyA9IFdzZGxOYW1lc1ZhbGlkYXRvci52YWxpZGF0ZU5DTmFtZTIoUEFSVF9OQU1FX0FUVFJJQlVURSwgd2ViUGFyYW0uZ2V0UGFydE5hbWUoKSk7DQotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdlYlBhcmFtLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBXUF9BTk5PVEFUSU9OLCBQQVJUX05BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdlYlBhcmFtKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9UYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNWY1MjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9UYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJwYXJhbTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5VUkk7DQotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLQ0KLS8qKg0KLSAqIENoZWNrIGlmIHRhcmdldE5hbWVzcGFjZSBhdHRyaWJ1dGUgb2Yge0BsaW5rIFdlYlBhcmFtfSBhbm5vdGF0aW9uIGlzIGNvcnJlY3QgVVJJLiAgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludCAgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOID0gInJldHVybiI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIFRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFdwQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIHdwID0gKElXZWJQYXJhbSljdHguZ2V0VGFyZ2V0KCk7IA0KLQkJaWYgKFJFVFVSTi5lcXVhbHMod3AuZ2V0SW1wbGVtZW50YXRpb24oKSkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3ApOw0KLQkJfQ0KLQkJDQotCQl0cnkgew0KLQkJCW5ldyBVUkkod3AuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOw0KLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsgLy8gJEpMLUVYQyQNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdwLCBKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5iaW5kKA0KLQkJCQkJCQkJCQkJSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnRfVVJJX1NZTlRBWF9FUlJPUiwNCi0JCQkJCW5ldyBPYmplY3RbXSB7ZS5nZXRJbmRleCgpLCBlLmdldElucHV0KCksIGUuZ2V0UmVhc29uKCl9KSwgV1BfQU5OT1RBVElPTiwgVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3ApOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9XcENvbnN0cmFpbnREZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vV3BDb25zdHJhaW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTIyMjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9XcENvbnN0cmFpbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnBhcmFtOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5Db25zdHJhaW50U2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RhbnRzOw0KLQ0KLS8qKg0KLSAqIFRoZSBjb25zdHJhaW50IGRlc2NyaXB0b3IgZm9yIFdlYlBhcmFtIHZhbGlkYXRpb24gY29uc3RyYWludHMgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLWNsYXNzIFdwQ29uc3RyYWludERlc2NyaXB0b3IgZXh0ZW5kcyBEb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3INCi17CQ0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KLQkJcmV0dXJuIERvbVZhbGlkYXRpb25Db25zdGFudHMuV1BfQ09OU1RSQUlOVF9JRDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgew0KLQkJcmV0dXJuIEpheFdzRG9tUnVudGltZVBsdWdpbi5QTFVHSU5fSUQ7DQotCX0NCi0NCi0JcHVibGljIENvbnN0cmFpbnRTZXZlcml0eSBnZXRTZXZlcml0eSgpIHsNCi0JCXJldHVybiBDb25zdHJhaW50U2V2ZXJpdHkuRVJST1I7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgew0KLQkJcmV0dXJuIC0yOTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2VicGFyYW0vV3BDb25zdHJhaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9XcENvbnN0cmFpbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDI4YzRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJwYXJhbS9XcENvbnN0cmFpbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJwYXJhbTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5JTW9kZWxDb25zdHJhaW50Ow0KLQ0KLS8qKg0KLSAqIENvbnN0cmFpbnQgcHJvdmlkZXIgZm9yIHZhbGlkYXRpb24gb2Ygd2ViUHJhbS4gQ29sbGVjdHMgYWxsIA0KLSAqIGNvbnN0cmFpbnRzIGZvciBXZWJQYXJhbSBhbm5vdGF0aW9uIGFuZCByZXR1cm5zIHRoZW0gYXMgY29sbGVjdGlvbi4gDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXcENvbnN0cmFpbnRQcm92aWRlciANCi17DQotCXByaXZhdGUgU2V0PElNb2RlbENvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzOw0KLQkNCi0JcHVibGljIENvbGxlY3Rpb248SU1vZGVsQ29uc3RyYWludD4gZ2V0Q29uc3RyYWludHMoKSANCi0Jew0KLQkJaWYgKGNvbnN0cmFpbnRzID09IG51bGwpIA0KLQkJew0KLQkJCWNvbnN0cmFpbnRzID0gbmV3IEhhc2hTZXQ8SU1vZGVsQ29uc3RyYWludD4oKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IE5hbWVJc05DTmFtZUNvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBOYW1lSXNVbmlxdWVDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgTmFtZUlzUmVkdW5kYW50Q29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IE5hbWVJc1JlcXVpcmVkQ29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IFBhcnROYW1lSXNOQ05hbWVDb25zdHJhaW50KCkpOwkJCQ0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQoKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjb25zdHJhaW50czsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9FbmRwb2ludENvcnJlY3RDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9FbmRwb2ludENvcnJlY3RDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwZjE1NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvRW5kcG9pbnRDb3JyZWN0Q29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbTJSZXNvdXJjZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuRW5kcG9pbnRUeXBlVmFsaWRhdG9yOw0KLQ0KLS8qKg0KLSAqIENoZWNrcyB0aGUgZW5kcG9pbnQgY2xhc3MgaWYgaXQgaXMgY2FwYWJsZSB0byBiZSB1c2VkIGFzIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbg0KLSAqIGFjY29yZGluZyB0byBqc3ItMTgxIHNlY3Rpb24gMy4xDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludENvcnJlY3RDb25zdHJhaW50ICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCXByaXZhdGUgZmluYWwgRW5kcG9pbnRUeXBlVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBFbmRwb2ludENvcnJlY3RDb25zdHJhaW50KCkgDQotCXsNCi0JCXN1cGVyKG5ldyBXc0NvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQkJdmFsaWRhdG9yID0gbmV3IEVuZHBvaW50VHlwZVZhbGlkYXRvcigpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gKElXZWJTZXJ2aWNlKSBjdHguZ2V0VGFyZ2V0KCk7CQkNCi0JCWZpbmFsIElUeXBlIHdzVHlwZSA9IERvbTJSZXNvdXJjZU1hcHBlci5JTlNUQU5DRS5maW5kVHlwZSh3cyk7DQotCQlpZiAod3NUeXBlPT1udWxsKSB7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUod3NUeXBlKTsNCi0JCWlmICghc3RhdHVzLmlzT0soKSkgew0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMod3MsIHN0YXR1cy5nZXRNZXNzYWdlKCksIFdTX0FOTk9UQVRJT04sIG51bGwpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL0VuZHBvaW50SW1wbGVtZW50c1NlaUNvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL0VuZHBvaW50SW1wbGVtZW50c1NlaUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY0NjM4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9FbmRwb2ludEltcGxlbWVudHNTZWlDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnNlcnZpY2U7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tMlJlc291cmNlTWFwcGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5TZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcjsNCi0NCi0vKioNCi0gKiBWYWxpZGF0ZXMgaWYgdGhlIFdlYlNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbXBsZW1lbnRzIG1ldGhvZHMgZnJvbQ0KLSAqIHJlZmVyZW5jZWQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludEltcGxlbWVudHNTZWlDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIEVuZHBvaW50SW1wbGVtZW50c1NlaUNvbnN0cmFpbnQoKSANCi0Jew0KLQkJc3VwZXIobmV3IFdzQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSAoSVdlYlNlcnZpY2UpIGN0eC5nZXRUYXJnZXQoKTsNCi0JCQ0KLQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpPT1udWxsIHx8IHdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmlzSW1wbGljaXQoKSkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCQl9DQotCQkJDQotCQlmaW5hbCBJVHlwZSB3c1R5cGUgPSBmaW5kVHlwZSh3cyk7DQotCQlmaW5hbCBJVHlwZSBzZWlUeXBlID0gZmluZFR5cGUod3MuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJDQotCQlpZiAod3NUeXBlPT1udWxsIHx8IHNlaVR5cGU9PW51bGwpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3Ioc2VpVHlwZSk7CQkNCi0JCWZpbmFsIElTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLnZhbGlkYXRlKHdzVHlwZSk7DQotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdzLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBXU19BTk5PVEFUSU9OLCBFTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlKGZpbmFsIEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gRG9tMlJlc291cmNlTWFwcGVyLklOU1RBTkNFLmZpbmRUeXBlKGVPYmplY3QpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL0VuZHBvaW50SW50ZXJmYWNlRXhpc3RzQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvRW5kcG9pbnRJbnRlcmZhY2VFeGlzdHNDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmNDllYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvRW5kcG9pbnRJbnRlcmZhY2VFeGlzdHNDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnNlcnZpY2U7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzLlZhbGlkYXRpb25NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIENoZWNrcyBpZiByZWZlcmVuY2VkIGJ5IGVuZHBvaW50IFNFSSBleGlzdHMgaW4gdGhlIHByb2plY3QuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRJbnRlcmZhY2VFeGlzdHNDb25zdHJhaW50ICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBFbmRwb2ludEludGVyZmFjZUV4aXN0c0NvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgV3NDb25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IChJV2ViU2VydmljZSljdHguZ2V0VGFyZ2V0KCk7ICANCi0JCWZpbmFsIElBbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKElBbm5vdGF0aW9uQWRhcHRlcilBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod3MsIElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcyk7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKFdTX0FOTk9UQVRJT04pOw0KLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCQl9DQotDQotCQlmaW5hbCBTdHJpbmcgc2VpRlFOYW1lID0gYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKEVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEUpOw0KLQkJaWYgKHNlaUZRTmFtZSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JCX0NCi0NCi0JCWlmICh3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKT09bnVsbCkgew0KLQkJCWZpbmFsIFN0cmluZyBtc2cgPSBWYWxpZGF0aW9uTWVzc2FnZXMuYmluZChWYWxpZGF0aW9uTWVzc2FnZXMuV3NWYWxpZGF0aW9uX1NlaURvZXNOb3RFeGlzdHMsIHNlaUZRTmFtZSk7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3cywgbXNnLCBXU19BTk5PVEFUSU9OLCBFTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9FbmRwb2ludElzU2Vzc2lvbkJlYW5Db25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9FbmRwb2ludElzU2Vzc2lvbkJlYW5Db25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2YjJhYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvRW5kcG9pbnRJc1Nlc3Npb25CZWFuQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb20yUmVzb3VyY2VNYXBwZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzLlZhbGlkYXRpb25NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5GYWNldFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLklGYWNldFV0aWxzOw0KLQ0KLS8qKg0KLSAqIENvbnN0cmFpbnQgZm9yIHZhbGlkYXRpbmcgd2hldGhlciBhIGNsYXNzIGluIGEgRUpCIG1vZHVsZSBhbm5vdGF0ZWQgd2l0aCB0aGUgIkBXZWJTZXJ2aWNlIiBhbm5vdGF0aW9uIGlzIGEgc2Vzc2lvbiBiZWFuDQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRJc1Nlc3Npb25CZWFuQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCXB1YmxpYyBFbmRwb2ludElzU2Vzc2lvbkJlYW5Db25zdHJhaW50KCkNCi0Jew0KLQkJc3VwZXIobmV3IFdzQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoZmluYWwgSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSAoSVdlYlNlcnZpY2UpIGN0eC5nZXRUYXJnZXQoKTsNCi0JCWZpbmFsIElUeXBlIHdzVHlwZSA9IERvbTJSZXNvdXJjZU1hcHBlci5JTlNUQU5DRS5maW5kVHlwZSh3cyk7DQotCQlpZiAod3NUeXBlID09IG51bGwgfHwgd3NUeXBlLmdldFJlc291cmNlKCkgPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQkJfQ0KLQ0KLQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHdzVHlwZS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsNCi0JCWlmICghZmFjZXRVdGlscygpLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgSUZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX1ZFUlNJT04sIElGYWNldFV0aWxzLkVKQl8zMF9GQUNFVF9JRCkpDQotCQl7DQotCQkJcmV0dXJuIGNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JCX0NCi0NCi0JCWlmICghaXNTZXNzaW9uQmVhbih3c1R5cGUpKQ0KLQkJew0KLQkJCXJldHVybiBjcmVhdGVTdGF0dXMod3MsIFZhbGlkYXRpb25NZXNzYWdlcy5Xc1ZhbGlkYXRpb25fV3NBbm5vdGF0aW9uT25Ob25TZXNzaW9uQmVhbl9FcnJvciwgV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTiwgbnVsbCk7DQotCQl9DQotDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQ0KLQl9DQotDQotCXByaXZhdGUgSUZhY2V0VXRpbHMgZmFjZXRVdGlscygpDQotCXsNCi0JCXJldHVybiBuZXcgRmFjZXRVdGlscygpOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNTZXNzaW9uQmVhbihmaW5hbCBJVHlwZSBlbmRwb2ludFR5cGUpDQotCXsNCi0JCWZpbmFsIElNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlbmRwb2ludFR5cGUuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkpOw0KLQkJZmluYWwgT2JqZWN0IG1vZGVsT2JqZWN0ID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsNCi0JCWZpbmFsIExpc3Q8U2Vzc2lvbkJlYW4+IHNlc3Npb25CZWFucyA9ICgob3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyKSBtb2RlbE9iamVjdCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuZ2V0U2Vzc2lvbkJlYW5zKCk7DQotCQlmb3IgKFNlc3Npb25CZWFuIGJlYW4gOiBzZXNzaW9uQmVhbnMpDQotCQl7DQotCQkJaWYgKGJlYW4uZ2V0RWpiQ2xhc3MoKS5lcXVhbHMoZW5kcG9pbnRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9OYW1lUmVkdW5kYW50Q29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvTmFtZVJlZHVuZGFudENvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjhkYzM3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9OYW1lUmVkdW5kYW50Q29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBuYW1lIGF0dHJpYnV0ZSBvbiBlZG5wb2ludCB0aGF0IHJlZmVyZW5jZXMgU0VJLg0KLSAqIEFjY29yZGluZyB0byBqc3ItMTgxIHBvaW50IDMuMSBzdWJwb2ludCA1Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmFtZVJlZHVuZGFudENvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50DQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgLSBubyBzcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUgDQotCSAqLw0KLQlwdWJsaWMgTmFtZVJlZHVuZGFudENvbnN0cmFpbnQoKSB7DQotCQlzdXBlcihuZXcgV3NDb25zdHJhaW50RGVzY3JpcHRvcigpKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gKElXZWJTZXJ2aWNlKWN0eC5nZXRUYXJnZXQoKTsNCi0JCWlmICh3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSE9bnVsbCAmJiB3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5pc0ltcGxpY2l0KCkpIHsJCQkNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQkJfQkNCi0JCQ0KLQkJaWYgKGhhc05hbWVBdHRyaWJ1dGUod3MpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3cywgVmFsaWRhdGlvbk1lc3NhZ2VzLldzVmFsaWRhdGlvbl9OYW1lU2hvdWxkTm90QmVVc2VkV2l0aFNlaSwgV1NfQU5OT1RBVElPTiwgTkFNRV9BVFRSSUJVVEUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOYW1lQXR0cmlidXRlKGZpbmFsIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UpDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBmaW5kQW5ub3RhdGlvbih3ZWJTZXJ2aWNlLCBXU19BTk5PVEFUSU9OKTsNCi0JCWlmIChhbm5vdGF0aW9uPT1udWxsKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKSE9bnVsbDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9Qb3J0TmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvUG9ydE5hbWVJc05DTmFtZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzZiNTI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9Qb3J0TmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlBPUlRfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuV3NkbE5hbWVzVmFsaWRhdG9yOw0KLQ0KLS8qKg0KLSAqIENoZWNrcyBpZiBwb3J0TmFtZSBhdHRyaWJ1dGUgb2YgV2ViU2VydmljZSBhbm5vdGF0aW9uIGlzIHZhbGlkIE5DTmFtZSANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFBvcnROYW1lSXNOQ05hbWVDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludA0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIC0gbm8gc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlIA0KLQkgKi8NCi0JcHVibGljIFBvcnROYW1lSXNOQ05hbWVDb25zdHJhaW50KCkgew0KLQkJc3VwZXIobmV3IFdzQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSAoSVdlYlNlcnZpY2UpY3R4LmdldFRhcmdldCgpOw0KLQkJZmluYWwgSVN0YXR1cyBzdGF0dXMgPSBXc2RsTmFtZXNWYWxpZGF0b3IudmFsaWRhdGVOQ05hbWUyKFBPUlRfTkFNRV9BVFRSSUJVVEUsIHdzLmdldFBvcnROYW1lKCkpOw0KLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7DQotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyh3cywgc3RhdHVzLmdldE1lc3NhZ2UoKSwgV1NfQU5OT1RBVElPTiwgUE9SVF9OQU1FX0FUVFJJQlVURSk7DQotCQl9CQ0KLQkJDQotCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1NlcnZpY2VOYW1lSXNOQ05hbWVDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9TZXJ2aWNlTmFtZUlzTkNOYW1lQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzlkYmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1NlcnZpY2VOYW1lSXNOQ05hbWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLndlYnNlcnZpY2U7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuU0VSVklDRV9OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Xc2RsTmFtZXNWYWxpZGF0b3I7DQotDQotLyoqDQotICogQ2hlY2tzIGlmIHNlcnZpY2VOYW1lIGF0dHJpYnV0ZSBvZiBXZWJTZXJ2aWNlIGFubm90YXRpb24gaXMgdmFsaWQgTkNOYW1lDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlTmFtZUlzTkNOYW1lQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBTZXJ2aWNlTmFtZUlzTkNOYW1lQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXc0NvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSAoSVdlYlNlcnZpY2UpY3R4LmdldFRhcmdldCgpOw0KLQkJZmluYWwgSVN0YXR1cyBzdGF0dXMgPSBXc2RsTmFtZXNWYWxpZGF0b3IudmFsaWRhdGVOQ05hbWUyKFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUsIHdzLmdldE5hbWUoKSk7DQotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdzLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBXU19BTk5PVEFUSU9OLCBTRVJWSUNFX05BTUVfQVRUUklCVVRFKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1RhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkMTVjODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2Vic2VydmljZTsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5VUkk7DQotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50Ow0KLQ0KLS8qKg0KLSAqIENoZWNrcyBpZiB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlIG9mIFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBpcyB2YWxpZCBVUkkNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50ICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciAtIG5vIHNwZWNpZmljIHByb2Nlc3NpbmcgaGVyZSANCi0JICovDQotCXB1YmxpYyBUYXJnZXROc1ZhbGlkVXJpQ29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXc0NvbnN0cmFpbnREZXNjcmlwdG9yKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gKElXZWJTZXJ2aWNlKWN0eC5nZXRUYXJnZXQoKTsgDQotCQl0cnkgew0KLQkJCW5ldyBVUkkod3MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOw0KLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsgLy8gJEpMLUVYQyQNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdzLCBKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5iaW5kKA0KLQkJCQkJCQkJCQkJSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuVGFyZ2V0TnNWYWxpZFVyaUNvbnN0cmFpbnRfVVJJX1NZTlRBWF9FUlJPUiwNCi0JCQkJCW5ldyBPYmplY3RbXSB7ZS5nZXRJbmRleCgpLCBlLmdldElucHV0KCksIGUuZ2V0UmVhc29uKCl9KQ0KLQkJCQkJLCBXU19BTk5PVEFUSU9OLCBUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvV3NDb25zdHJhaW50RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvV3NDb25zdHJhaW50RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDI4Y2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1dzQ29uc3RyYWludERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2Vic2VydmljZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuQ29uc3RyYWludFNldmVyaXR5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZG9tLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkNvbnN0YW50czsNCi0NCi0vKioNCi0gKiBUaGUgY29uc3RyYWludCBkZXNjcmlwdG9yIGZvciBXUyBjb25zdHJhaW50cyANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotY2xhc3MgV3NDb25zdHJhaW50RGVzY3JpcHRvciBleHRlbmRzIERvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvcg0KLXsJDQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7DQotCQlyZXR1cm4gRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5XU19DT05TVFJBSU5UX0lEOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgew0KLQkJcmV0dXJuIEpheFdzRG9tUnVudGltZVBsdWdpbi5QTFVHSU5fSUQ7DQotCX0NCi0NCi0JcHVibGljIENvbnN0cmFpbnRTZXZlcml0eSBnZXRTZXZlcml0eSgpIHsNCi0JCXJldHVybiBDb25zdHJhaW50U2V2ZXJpdHkuRVJST1I7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgew0KLQkJcmV0dXJuIC0yNjsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9Xc0NvbnN0cmFpbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS92YWxpZGF0aW9uL3dlYnNlcnZpY2UvV3NDb25zdHJhaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjc5YzJhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9Xc0NvbnN0cmFpbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklNb2RlbENvbnN0cmFpbnQ7DQotDQotLyoqDQotICogVGhlIGNvbnN0cmFpbnQgcHJvdmlkZXIgZm9yIFdlYlNlcnZpY2Ugb2JqZWN0cw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV3NDb25zdHJhaW50UHJvdmlkZXIgDQotew0KLQlwcml2YXRlIFNldDxJTW9kZWxDb25zdHJhaW50PiBjb25zdHJhaW50czs7DQotCQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJTW9kZWxDb25zdHJhaW50PiBnZXRDb25zdHJhaW50cygpIA0KLQl7DQotCQlpZiAoY29uc3RyYWludHMgPT0gbnVsbCkgDQotCQl7DQotCQkJY29uc3RyYWludHMgPSBuZXcgSGFzaFNldDxJTW9kZWxDb25zdHJhaW50PigpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgU2VydmljZU5hbWVJc05DTmFtZUNvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBQb3J0TmFtZUlzTkNOYW1lQ29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IFRhcmdldE5zVmFsaWRVcmlDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgRW5kcG9pbnRJbnRlcmZhY2VFeGlzdHNDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgV3NkbExvY2F0aW9uQ29ycmVjdENvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBOYW1lUmVkdW5kYW50Q29uc3RyYWludCgpKTsNCi0JCQljb25zdHJhaW50cy5hZGQobmV3IEVuZHBvaW50Q29ycmVjdENvbnN0cmFpbnQoKSk7DQotCQkJY29uc3RyYWludHMuYWRkKG5ldyBFbmRwb2ludEltcGxlbWVudHNTZWlDb25zdHJhaW50KCkpOw0KLQkJCWNvbnN0cmFpbnRzLmFkZChuZXcgRW5kcG9pbnRJc1Nlc3Npb25CZWFuQ29uc3RyYWludCgpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNvbnN0cmFpbnRzOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1dzZGxMb2NhdGlvbkNvcnJlY3RDb25zdHJhaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3ZhbGlkYXRpb24vd2Vic2VydmljZS9Xc2RsTG9jYXRpb25Db3JyZWN0Q29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NGE0NTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdmFsaWRhdGlvbi93ZWJzZXJ2aWNlL1dzZGxMb2NhdGlvbkNvcnJlY3RDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi53ZWJzZXJ2aWNlOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTRExfTE9DQVRJT05fQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uSVZhbGlkYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5Db25zdHJhaW50U2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLkFubm90YXRpb25BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb20yUmVzb3VyY2VNYXBwZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLm1lc3NhZ2VzLlZhbGlkYXRpb25NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIENoZWNrcyBpZiB0aGUgV1NETCBsb2NhdGlvbiBjb250YWlucyB2YWxpZCB2YWx1ZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzZGxMb2NhdGlvbkNvcnJlY3RDb25zdHJhaW50ICBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi17DQotCXB1YmxpYyBXc2RsTG9jYXRpb25Db3JyZWN0Q29uc3RyYWludCgpIHsNCi0JCXN1cGVyKG5ldyBXYXJuaW5nQ29uc3RyYWludERlc2NyaXB0b3IoKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJU3RhdHVzIGRvVmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0JewlmaW5hbCBJV2ViU2VydmljZSB3cyA9IChJV2ViU2VydmljZSljdHguZ2V0VGFyZ2V0KCk7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gZmluZEFubm90YXRpb24od3MsIFdTX0FOTk9UQVRJT04pOw0KLQkJaWYgKGFubm90YXRpb249PW51bGwgfHwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdTRExfTE9DQVRJT05fQVRUUklCVVRFKT09bnVsbCkgew0KLQkJCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCQl9DQotCQkNCi0JCWlmIChjaGVja1dzZGxMb2NhdGlvbkluUHJvamVjdCh3cykpIHsNCi0JCQlyZXR1cm4gY3JlYXRlT2tTdGF0dXMod3MpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY2hlY2tXc2RsVXJsKHdzLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV1NETF9MT0NBVElPTl9BVFRSSUJVVEUpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElTdGF0dXMgY2hlY2tXc2RsVXJsKGZpbmFsIElXZWJTZXJ2aWNlIHdzLCBmaW5hbCBTdHJpbmcgd3NkbFVybCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0cnkgew0KLQkJCW5ldyBVUkwod3NkbFVybCk7DQotCQl9DQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsgLy8gJEpMLUVYQyQNCi0JCQlTdHJpbmcgbXNnID0gVmFsaWRhdGlvbk1lc3NhZ2VzLmJpbmQoVmFsaWRhdGlvbk1lc3NhZ2VzLldzVmFsaWRhdGlvbl9Xc2RsRG9lc05vdEV4aXN0cywNCi0JCQkJCWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsNCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHdzLCBtc2csIFdTX0FOTk9UQVRJT04sIFdTRExfTE9DQVRJT05fQVRUUklCVVRFKTsNCi0JCX0gDQotCQkNCi0JCXJldHVybiBjcmVhdGVPa1N0YXR1cyh3cyk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrV3NkbExvY2F0aW9uSW5Qcm9qZWN0KGZpbmFsIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKElBbm5vdGF0aW9uQWRhcHRlcilBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViU2VydmljZSwgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oV1NfQU5OT1RBVElPTik7DQotCQlpZiAoYW5ub3RhdGlvbj09bnVsbCkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmcgd3NkbExvY2F0aW9uID0gYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdTRExfTE9DQVRJT05fQVRUUklCVVRFKTsNCi0JCWlmICh3c2RsTG9jYXRpb24gPT0gbnVsbCkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlpZiAod3NkbExvY2F0aW9uLnRyaW0oKS5sZW5ndGgoKT09MCkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZpbmRGaWxlKHdlYlNlcnZpY2UsIHdzZGxMb2NhdGlvbik7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGZpbmRGaWxlKGZpbmFsIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UsIGZpbmFsIFN0cmluZyBmaWxlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0UuZmluZFByb2plY3QoKElXZWJTZXJ2aWNlUHJvamVjdCl3ZWJTZXJ2aWNlLmVDb250YWluZXIoKSk7DQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmZpbmRNZW1iZXIoZmlsZSk7DQotCQlpZiAocmVzb3VyY2UhPW51bGwpCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOw0KLQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSkgDQotCQl7DQotCQkJaWYgKHJvb3QuZ2V0UmVzb3VyY2UoKT09bnVsbCkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJaWYgKHJvb3QuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCk9PUlSZXNvdXJjZS5GT0xERVIpIHsNCi0JCQkJaWYgKCgoSUZvbGRlcikgcm9vdC5nZXRSZXNvdXJjZSgpKS5maW5kTWVtYmVyKGZpbGUpICE9IG51bGwpIHsNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgV2FybmluZ0NvbnN0cmFpbnREZXNjcmlwdG9yIGV4dGVuZHMgV3NDb25zdHJhaW50RGVzY3JpcHRvcg0KLQl7DQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBDb25zdHJhaW50U2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKSB7DQotCQkJcmV0dXJuIENvbnN0cmFpbnRTZXZlcml0eS5XQVJOSU5HOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTc4NGFjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGJiMmI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNUdWUgSnVuIDIzIDEwOjM4OjIyIEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YWE2MjNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaSRJbXBsZW1lbnRhdGlvbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cyIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywKLSBvcmcuZWNsaXBzZS5qZmFjZQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTBhZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDE1LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxODRlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1iaW4uaW5jbHVkZXMgPSAuLFwNCi0gICAgICAgICAgICAgICBpY29ucy8sXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwNCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1NFSS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvU0VJLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjEzMjVjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvU0VJLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9TRUlfR3JvdXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1NFSV9Hcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhZmNjMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1NFSV9Hcm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX01ldGhvZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX01ldGhvZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4MThhMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9NZXRob2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9QYXJhbV9Jbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1BhcmFtX0luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmU2YjM0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1BhcmFtX0luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfUGFyYW1fT3V0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfUGFyYW1fT3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmQwOTE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1BhcmFtX091dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTIxNmIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlX0dyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZV9Hcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiNDgxNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlX0dyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZV9JdGVtX1Byb3ZpZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZV9JdGVtX1Byb3ZpZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2VfSXRlbV9Qcm92aWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZXJyb3Jfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9lcnJvcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYmM2MDY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9lcnJvcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJRE9NX3dlYlNlcnZpY2VQcm9qZWN0c19JV2ViU2VydmljZVByb2plY3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJRE9NX3dlYlNlcnZpY2VQcm9qZWN0c19JV2ViU2VydmljZVByb2plY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Yzc2Njc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSURPTV93ZWJTZXJ2aWNlUHJvamVjdHNfSVdlYlNlcnZpY2VQcm9qZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV93ZWJNZXRob2RzX0lXZWJNZXRob2QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3dlYk1ldGhvZHNfSVdlYk1ldGhvZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1ZjVhOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3dlYk1ldGhvZHNfSVdlYk1ldGhvZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJNZXRob2RfcGFyYW1ldGVyc19JV2ViUGFyYW0uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViTWV0aG9kX3BhcmFtZXRlcnNfSVdlYlBhcmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNkNjNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJNZXRob2RfcGFyYW1ldGVyc19JV2ViUGFyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViU2VydmljZVByb2plY3Rfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlc19JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0X3NlcnZpY2VFbmRwb2ludEludGVyZmFjZXNfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2MWIxODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViU2VydmljZVByb2plY3Rfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlc19JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0X3dlYlNlcnZpY2VzX0lXZWJTZXJ2aWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0X3dlYlNlcnZpY2VzX0lXZWJTZXJ2aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTEyMGQxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdF93ZWJTZXJ2aWNlc19JV2ViU2VydmljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JRE9NLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lET00uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MjBlZWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lET00uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWE1OGE2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzYTk5N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViTWV0aG9kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJNZXRob2QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMTdkYzdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJNZXRob2QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlBhcmFtLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJQYXJhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNWM3MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlBhcmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJTZXJ2aWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJTZXJ2aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM1MDBkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViU2VydmljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViU2VydmljZVByb2plY3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlNlcnZpY2VQcm9qZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDk4MzY0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViU2VydmljZVByb2plY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlR5cGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDBhZWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy93YXJuaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvd2FybmluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjJlNTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy93YXJuaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhYTNiNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jIFRvIGNvZGUgZGV2ZWxvcGVyOg0KLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUNCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4NCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlDQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5Lg0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUNCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotQnVuZGxlLU5hbWUuMD1KQVgtV1MgRE9NIFVJIFBsdWctaW4gKEluY3ViYXRpb24pDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQotDQotX1VJX0NyZWF0ZUNoaWxkX3RleHQgPSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9DQotX1VJX0NyZWF0ZUNoaWxkX3RleHQzID0gezF9DQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmVhdGUgTmV3IHswfSBVbmRlciB7MX0gRmVhdHVyZQ0KLV9VSV9DcmVhdGVDaGlsZF9kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBjaGlsZCBvZiB0eXBlIHswfSBmb3IgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZSBzZWxlY3RlZCB7Mn0uDQotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgc2libGluZyBvZiB0eXBlIHswfSBmb3IgdGhlIHNlbGVjdGVkIHsyfSwgdW5kZXIgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZWlyIHBhcmVudC4NCi0NCi1fVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uID0gVGhlIHswfSBvZiB0aGUgezF9DQotDQotX1VJX0lET01fdHlwZSA9IElET00NCi1fVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF90eXBlID0gSmF2YSBXZWIgU2VydmljZSBFbGVtZW50DQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfdHlwZSA9IFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlDQotX1VJX0lXZWJTZXJ2aWNlX3R5cGUgPSBXZWIgU2VydmljZQ0KLV9VSV9JV2ViU2VydmljZVByb2plY3RfdHlwZSA9IFdlYiBTZXJ2aWNlIFByb2plY3QNCi1fVUlfVW5rbm93bl90eXBlID0gT2JqZWN0DQotDQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFZhbHVlDQotDQotX1VJX0lET01fd2ViU2VydmljZVByb2plY3RzX2ZlYXR1cmUgPSBXZWIgU2VydmljZSBQcm9qZWN0cw0KLV9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X2phdmFJbXBsZW1lbnRhdGlvbl9mZWF0dXJlID0gSmF2YSBJbXBsZW1lbnRhdGlvbg0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX25hbWVfZmVhdHVyZSA9IE5hbWUNCi1fVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9pbXBsaWNpdF9mZWF0dXJlID0gSW1wbGljaXQNCi1fVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9pbXBsZW1lbnRpbmdXZWJTZXJ2aWNlc19mZWF0dXJlID0gSW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlcw0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3RhcmdldE5hbWVzcGFjZV9mZWF0dXJlID0gVGFyZ2V0IE5hbWVzcGFjZQ0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nID0gU09BUCBCaW5kaW5nDQotX1VJX0lXZWJTZXJ2aWNlX25hbWVfZmVhdHVyZSA9IE5hbWUNCi1fVUlfSVdlYlNlcnZpY2Vfc2VydmljZUVuZHBvaW50X2ZlYXR1cmUgPSBTZXJ2aWNlIEVuZHBvaW50DQotX1VJX0lXZWJTZXJ2aWNlX3RhcmdldE5hbWVzcGFjZV9mZWF0dXJlID0gVGFyZ2V0IE5hbWVzcGFjZQ0KLV9VSV9JV2ViU2VydmljZV9wb3J0TmFtZV9mZWF0dXJlCQk9IFBvcnQgTmFtZQ0KLV9VSV9JV2ViU2VydmljZV93c2RsTG9jYXRpb25fZmVhdHVyZQk9IFdTREwgTG9jYXRpb24NCi1fVUlfSVdlYlNlcnZpY2VQcm9qZWN0X3dlYlNlcnZpY2VzX2ZlYXR1cmUgPSBXZWIgU2VydmljZXMNCi1fVUlfSVdlYlNlcnZpY2VQcm9qZWN0X3NlcnZpY2VFbmRwb2ludEludGVyZmFjZXNfZmVhdHVyZSA9IFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcw0KLV9VSV9JV2ViU2VydmljZVByb2plY3RfbmFtZV9mZWF0dXJlID0gTmFtZQ0KLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBVbnNwZWNpZmllZA0KLQ0KLV9VSV9XZWJTZXJ2aWNlQW5ub3RhdGlvbkNhdGVnb3J5ID0gR2VuZXJhbCAoV2ViU2VydmljZSBhbm5vdGF0aW9uKQ0KLV9VSV9XZWJNZXRob2RBbm5vdGF0aW9uQ2F0ZWdvcnkgPSBHZW5lcmFsIChXZWJNZXRob2QgYW5ub3RhdGlvbikNCi1fVUlfV2ViUGFyYW1Bbm5vdGF0aW9uQ2F0ZWdvcnkgPSBHZW5lcmFsIChXZWJQYXJhbSBhbm5vdGF0aW9uKQ0KLQ0KLV9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X2ltcGxlbWVudGF0aW9uX2ZlYXR1cmUgPSBKYXZhIHJlcHJlc2VudGF0aW9uDQotX1VJX0lXZWJNZXRob2RfdHlwZSA9IFdlYiBNZXRob2QNCi1fVUlfSVdlYlBhcmFtX3R5cGUgPSBXZWIgUGFyYW0NCi1fVUlfSVdlYlR5cGVfdHlwZSA9IFdlYiBUeXBlDQotX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfbmFtZV9mZWF0dXJlID0gTmFtZQ0KLV9VSV9JV2ViTWV0aG9kX2V4Y2x1ZGVkX2ZlYXR1cmUgPSBFeGNsdWRlZA0KLV9VSV9JV2ViUGFyYW1fa2luZF9mZWF0dXJlID0gTW9kZQ0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3dlYk1ldGhvZHNfZmVhdHVyZSA9IFdlYiBNZXRob2RzDQotX1VJX0lXZWJNZXRob2RfcGFyYW1ldGVyc19mZWF0dXJlID0gUGFyYW1ldGVycw0KLV9VSV9JV2ViUGFyYW1fdHlwZU5hbWVfZmVhdHVyZSA9IFR5cGUgTmFtZQ0KLV9VSV9JV2ViUGFyYW1fcGFydE5hbWVfZmVhdHVyZSA9IFBhcnQgTmFtZQ0KLV9VSV9JV2ViUGFyYW1fdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUgPSBUYXJnZXQgTmFtZXNwYWNlDQotX1VJX0lXZWJQYXJhbV9oZWFkZXJfZmVhdHVyZSA9IEhlYWRlcg0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nU3R5bGVfZmVhdHVyZSA9IFN0eWxlDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdVc2VfZmVhdHVyZSA9IFVzZQ0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVfZmVhdHVyZSA9IFBhcmFtZXRlciBTdHlsZQ0KLV9VSV9JV2ViTWV0aG9kX3NvYXBCaW5kaW5nU3R5bGVfZmVhdHVyZSA9IFN0eWxlDQotX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdVc2VfZmVhdHVyZSA9IFVzZQ0KLV9VSV9JV2ViTWV0aG9kX3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVfZmVhdHVyZSA9IFBhcmFtZXRlciBTdHlsZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5NGQ2OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCi0NCi08IS0tDQotICAgIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICANCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIC0tPg0KLQ0KLTxwbHVnaW4+DQotDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQuaXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcmllcyI+DQotICAgICAgPGZhY3RvcnkNCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS5lY29yZSINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSINCi0gICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcz0NCi0gICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcg0KLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcg0KLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcg0KLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcg0KLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2UiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOTIzNTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tQWRhcHRlckZhY3Rvcnk7DQotDQotLyoqDQotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLg0KLSAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9Lg0KLSAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuDQotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIERvbUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7DQotCS8qKg0KLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5Ow0KLQ0KLQkvKioNCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsNCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxPYmplY3Q+IHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7DQotDQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7DQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOw0KLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOw0KLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTX0gaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElET01JdGVtUHJvdmlkZXIgaWRvbUl0ZW1Qcm92aWRlcjsNCi0NCi0JLyoqDQotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET019Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlET01BZGFwdGVyKCkgew0KLQkJaWYgKGlkb21JdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCWlkb21JdGVtUHJvdmlkZXIgPSBuZXcgSURPTUl0ZW1Qcm92aWRlcih0aGlzKTsNCi0JCX0NCi0NCi0JCXJldHVybiBpZG9tSXRlbVByb3ZpZGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudH0gaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIgaUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcjsNCi0NCi0JLyoqDQotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnRBZGFwdGVyKCkgew0KLQkJaWYgKGlKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCWlKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIgPSBuZXcgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcih0aGlzKTsNCi0JCX0NCi0NCi0JCXJldHVybiBpSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZX0gaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlcjsNCi0NCi0JLyoqDQotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VBZGFwdGVyKCkgew0KLQkJaWYgKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgPSBuZXcgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlcih0aGlzKTsNCi0JCX0NCi0NCi0JCXJldHVybiBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZH0gaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJNZXRob2RJdGVtUHJvdmlkZXIgaVdlYk1ldGhvZEl0ZW1Qcm92aWRlcjsNCi0NCi0JLyoqDQotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2R9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJNZXRob2RBZGFwdGVyKCkgew0KLQkJaWYgKGlXZWJNZXRob2RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCWlXZWJNZXRob2RJdGVtUHJvdmlkZXIgPSBuZXcgSVdlYk1ldGhvZEl0ZW1Qcm92aWRlcih0aGlzKTsNCi0JCX0NCi0NCi0JCXJldHVybiBpV2ViTWV0aG9kSXRlbVByb3ZpZGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtfSBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlBhcmFtSXRlbVByb3ZpZGVyIGlXZWJQYXJhbUl0ZW1Qcm92aWRlcjsNCi0NCi0JLyoqDQotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpIHsNCi0JCWlmIChpV2ViUGFyYW1JdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCWlXZWJQYXJhbUl0ZW1Qcm92aWRlciA9IG5ldyBJV2ViUGFyYW1JdGVtUHJvdmlkZXIodGhpcyk7DQotCQl9DQotDQotCQlyZXR1cm4gaVdlYlBhcmFtSXRlbVByb3ZpZGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2V9IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJV2ViU2VydmljZUl0ZW1Qcm92aWRlciBpV2ViU2VydmljZUl0ZW1Qcm92aWRlcjsNCi0NCi0JLyoqDQotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZUFkYXB0ZXIoKSB7DQotCQlpZiAoaVdlYlNlcnZpY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCWlXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyID0gbmV3IElXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyKHRoaXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGlXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0fSBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyIGlXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcjsNCi0NCi0JLyoqDQotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0QWRhcHRlcigpIHsNCi0JCWlmIChpV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCWlXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlciA9IG5ldyBJV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIodGhpcyk7DQotCQl9DQotDQotCQlyZXR1cm4gaVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGV9IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJV2ViVHlwZUl0ZW1Qcm92aWRlciBpV2ViVHlwZUl0ZW1Qcm92aWRlcjsNCi0NCi0JLyoqDQotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViVHlwZUFkYXB0ZXIoKSB7DQotCQlpZiAoaVdlYlR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCWlXZWJUeXBlSXRlbVByb3ZpZGVyID0gbmV3IElXZWJUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGlXZWJUeXBlSXRlbVByb3ZpZGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgew0KLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgew0KLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgew0KLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsNCi0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7DQotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzczw/Pil0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgew0KLQkJCQlyZXR1cm4gYWRhcHRlcjsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgew0KLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgew0KLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCi0NCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7DQotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiANCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQlpZiAoaWRvbUl0ZW1Qcm92aWRlciAhPSBudWxsKSBpZG9tSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JCWlmIChpSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyICE9IG51bGwpIGlKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KLQkJaWYgKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkgaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQotCQlpZiAoaVdlYk1ldGhvZEl0ZW1Qcm92aWRlciAhPSBudWxsKSBpV2ViTWV0aG9kSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JCWlmIChpV2ViUGFyYW1JdGVtUHJvdmlkZXIgIT0gbnVsbCkgaVdlYlBhcmFtSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JCWlmIChpV2ViU2VydmljZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBpV2ViU2VydmljZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQotCQlpZiAoaVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyICE9IG51bGwpIGlXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQotCQlpZiAoaVdlYlR5cGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgaVdlYlR5cGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JRE9NSXRlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSURPTUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGUxY2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JRE9NSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTX0gb2JqZWN0Lg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJRE9NSXRlbVByb3ZpZGVyDQotCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSURPTUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCi0NCi0JCX0NCi0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4NCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yDQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgew0KLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgew0KLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsNCi0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChEb21QYWNrYWdlLkxpdGVyYWxzLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTKTsNCi0JCX0NCi0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgew0KLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcg0KLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLg0KLQ0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIElET00uZ2lmLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0lET00iKSk7ICAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9JRE9NX3R5cGUiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQotDQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSURPTS5jbGFzcykpIHsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCi0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQotDQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KLQkJCQkoRG9tUGFja2FnZS5MaXRlcmFscy5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUywNCi0JCQkJIERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdCgpKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KLQkJcmV0dXJuIERvbVVpLklOU1RBTkNFOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JRE9NUHJvcGVydHlWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lET01Qcm9wZXJ0eVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4NjJiMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lET01Qcm9wZXJ0eVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotDQotLyoqDQotICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBwcm9wZXJ0eSB2YWx1ZS4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBpZGVudGlmeSBwcm9wZXJ0eSB2YWx1ZXMgZm9yIFdTIERPTSBvYmplY3RzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElET01Qcm9wZXJ0eVZhbHVlIGV4dGVuZHMgSUl0ZW1Qcm9wZXJ0eVNvdXJjZQ0KLXsNCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NGRiYjhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5pbXBsLkRPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudH0gb2JqZWN0Lg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyDQotCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCi0NCi0JCQlhZGRJbXBsZW1lbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCX0NCi0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEltcGxlbWVudGF0aW9uIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wbGVtZW50YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfaW1wbGVtZW50YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfaW1wbGVtZW50YXRpb25fZmVhdHVyZSIsICJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgbnVsbCwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXINCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9uYW1lX2ZlYXR1cmUiLCAiX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBUaGlzIG1ldGhvZCBkZWZpbmVzIGF0IHdoaWNoIGNhdGVnb3J5IHRoZSBuYW1lIHNob3VsZCBnbyB0by4gRXh0ZW5kZXIgb2YNCi0JICogdGhpcyBjbGFzcyBzaG91bGQgb3ZlcnJpZGUgaXQgaWYgd2FudHMgdGhlIG5hbWUgdG8gYmUgc2VwYXJhdGVkIGluIGRpZmZlcmVudCANCi0JICogdGhhbiBkZWZhdWx0IGNhdGVnb3J5Lg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVDYXRlZ29yeSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5naWYuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSUphdmFXZWJTZXJ2aWNlRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQotCQlTdHJpbmcgbGFiZWwgPSAoKElKYXZhV2ViU2VydmljZUVsZW1lbnQpb2JqZWN0KS5nZXROYW1lKCk7DQotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCi0JCQlnZXRTdHJpbmcoIl9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQNCi0JCQlnZXRTdHJpbmcoIl9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KLQ0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElKYXZhV2ViU2VydmljZUVsZW1lbnQuY2xhc3MpKSB7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOg0KLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsNCi0JCXJldHVybiBEb21VaS5JTlNUQU5DRTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjg4YmM0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTsNCi0NCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5pbXBsLkRPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZX0gb2JqZWN0Lg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyDQotCWV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgDQotCXsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gbnVsbDsNCi0JCQ0KLQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQ0KLQkJYWRkSW1wbGljaXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZEltcGxlbWVudGluZ1dlYlNlcnZpY2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRUYXJnZXROYW1lc3BhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFNvYXBCaW5kaW5nU3R5bGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFNvYXBCaW5kaW5nVXNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQkNCi0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEltcGxpY2l0IGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wbGljaXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfaW1wbGljaXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfaW1wbGljaXRfZmVhdHVyZSIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UsDQotCQkJCSBudWxsLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlcyBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZEltcGxlbWVudGluZ1dlYlNlcnZpY2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ltcGxlbWVudGluZ1dlYlNlcnZpY2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ltcGxlbWVudGluZ1dlYlNlcnZpY2VzX2ZlYXR1cmUiLCAiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVMsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgdHJ1ZSwNCi0JCQkJIG51bGwsDQotCQkJCSBudWxsLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFyZ2V0IE5hbWVzcGFjZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFRhcmdldE5hbWVzcGFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkobmV3IERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3RhcmdldE5hbWVzcGFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90YXJnZXROYW1lc3BhY2VfZmVhdHVyZSIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSwNCi0JCQkJIGdldE5hbWVDYXRlZ29yeSgpLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBCaW5kaW5nIFN0eWxlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcEJpbmRpbmdTdHlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZ1N0eWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nU3R5bGVfZmVhdHVyZSIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZyIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEJpbmRpbmcgVXNlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcEJpbmRpbmdVc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdVc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdVc2VfZmVhdHVyZSIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmciKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlX2ZlYXR1cmUiLCAiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4NCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yDQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgew0KLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgew0KLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsNCi0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMpOw0KLQkJfQ0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQotDQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5naWYuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIEltYWdlcy5JTlNUQU5DRS5nZXRJbWFnZShJbWFnZXMuSU1HX1NFSSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KLQkJU3RyaW5nIGxhYmVsID0gKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKW9iamVjdCkuZ2V0TmFtZSgpOw0KLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQotCQkJZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlIikgOiAvLyROT04tTkxTLTEkDQotCQkJbGFiZWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCi0NCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzKSkgew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U6DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRToNCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCi0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQotDQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KLQkJCQkoRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1dFQl9NRVRIT0RTLA0KLQkJCQkgRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYk1ldGhvZCgpKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KLQkJcmV0dXJuIERvbVVpLklOU1RBTkNFOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXROYW1lQ2F0ZWdvcnkoKQ0KLQl7DQotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZUFubm90YXRpb25DYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJNZXRob2RJdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViTWV0aG9kSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4MDA1NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJNZXRob2RJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7DQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uRG9tVWk7DQotDQotLyoqDQotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2R9IG9iamVjdC4NCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYk1ldGhvZEl0ZW1Qcm92aWRlciBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXINCi0JaW1wbGVtZW50cwkNCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkNCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkNCi0JCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KLQkvKioNCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJNZXRob2RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCi0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIA0KLQl7DQotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgIT0gbnVsbCkgew0KLQkJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JCX0NCi0JCQ0KLQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQkJDQotCQlhZGRFeGNsdWRlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkU29hcEJpbmRpbmdTdHlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkU29hcEJpbmRpbmdVc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCQ0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wbGVtZW50YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgDQotCXsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCgNCi0JCQluZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigNCi0JCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCQkgZ2V0U3RyaW5nKCJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9pbXBsZW1lbnRhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfaW1wbGVtZW50YXRpb25fZmVhdHVyZSIsICJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwNCi0JCQkJCSBmYWxzZSwNCi0JCQkJCSBmYWxzZSwNCi0JCQkJCSBmYWxzZSwNCi0JCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCQkgbnVsbCwNCi0JCQkJCSBudWxsKQ0KLQkJCXsNCi0JCQkJDQotCQkJCUBPdmVycmlkZSANCi0JCQkJcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpDQotCQkJCXsNCi0JCQkJCVN0cmluZyByZXR1cm5TdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJU3RyaW5nIHBhcmFtZXRlcnMgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClnZXRUYXJnZXQoKTsNCi0JCQkJCQkNCi0JCQkJCWZvcihJV2ViUGFyYW0gd2ViUGFyYW0gOiB3ZWJNZXRob2QuZ2V0UGFyYW1ldGVycygpKQ0KLQkJCQkJew0KLQkJCQkJCWlmKHdlYlBhcmFtLmdldE5hbWUoKS5lcXVhbHMoInJldHVybiIpKSAvLyROT04tTkxTLTEkDQotCQkJCQkJew0KLQkJCQkJCQlyZXR1cm5TdHJpbmcgPSBnZXRUeXBlTmFtZSh3ZWJQYXJhbS5nZXRUeXBlTmFtZSgpKSArICIgIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCX0NCi0JCQkJCQllbHNlDQotCQkJCQkJew0KLQkJCQkJCQlwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyArIGdldFR5cGVOYW1lKHdlYlBhcmFtLmdldFR5cGVOYW1lKCkpICsgIiwgIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCQkNCi0JCQkJCWlmIChwYXJhbWV0ZXJzLmxlbmd0aCgpID4gMCkgew0KLQkJCQkJCXBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLnN1YnN0cmluZygwLCBwYXJhbWV0ZXJzLmxhc3RJbmRleE9mKCcsJykpOw0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCQlTdHJpbmcgbWV0aG9kTmFtZSA9IHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpOyANCi0JCQkJCWludCBwb3MgPSBtZXRob2ROYW1lLmluZGV4T2YoJygnKTsNCi0JCQkJCWlmIChwb3MgPiAtMSkgew0KLQkJCQkJCW1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLnN1YnN0cmluZygwLCBwb3MpOw0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCQlyZXR1cm4gcmV0dXJuU3RyaW5nICsgbWV0aG9kTmFtZSArICcoJyArIHBhcmFtZXRlcnMgKyAnKSc7DQotCQkJCX0NCi0JCQkJDQotCQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gdHlwZU5hbWUuc3Vic3RyaW5nKHR5cGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsNCi0JCQkJfQ0KLQkJCX0pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXhjbHVkZWQgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGNsdWRlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYk1ldGhvZF9leGNsdWRlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYk1ldGhvZF9leGNsdWRlZF9mZWF0dXJlIiwgIl9VSV9JV2ViTWV0aG9kX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9NRVRIT0RfX0VYQ0xVREVELA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEJpbmRpbmcgU3R5bGUgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwQmluZGluZ1N0eWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViTWV0aG9kX3NvYXBCaW5kaW5nU3R5bGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdTdHlsZV9mZWF0dXJlIiwgIl9VSV9JV2ViTWV0aG9kX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmciKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBCaW5kaW5nIFVzZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFNvYXBCaW5kaW5nVXNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViTWV0aG9kX3NvYXBCaW5kaW5nVXNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViTWV0aG9kX3NvYXBCaW5kaW5nVXNlX2ZlYXR1cmUiLCAiX1VJX0lXZWJNZXRob2RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmciKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYk1ldGhvZF9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlX2ZlYXR1cmUiLCAiX1VJX0lXZWJNZXRob2RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmciKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlMpOw0KLQkJfQ0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQotDQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgV2ViX01ldGhvZC5naWYuDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfV0VCX01FVEhPRCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQotCQlTdHJpbmcgbGFiZWwgPSAoKElXZWJNZXRob2Qpb2JqZWN0KS5nZXROYW1lKCk7DQotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCi0JCQlnZXRTdHJpbmcoIl9VSV9JV2ViTWV0aG9kX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQNCi0JCQlsYWJlbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KLQ0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElXZWJNZXRob2QuY2xhc3MpKSB7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19FWENMVURFRDoNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCi0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQotDQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KLQkJCQkoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUywNCi0JCQkJIERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJQYXJhbSgpKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KLQkJcmV0dXJuIERvbVVpLklOU1RBTkNFOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVDYXRlZ29yeSgpDQotCXsNCi0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9XZWJNZXRob2RBbm5vdGF0aW9uQ2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJA0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlBhcmFtSXRlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlBhcmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwNzViYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTsNCi0NCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUuUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGwuRE9NSXRlbVByb3BlcnR5UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW19IG9iamVjdC4NCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlBhcmFtSXRlbVByb3ZpZGVyDQotCWV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCQ0KLQkvKioNCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJQYXJhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzICE9IG51bGwpIHsNCi0JCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQotCQl9DQotCQkNCi0JCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCi0NCi0JCWFkZEtpbmRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFR5cGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkVGFyZ2V0TmFtZXNwYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRIZWFkZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCQ0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgS2luZCBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZEtpbmRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJQYXJhbV9raW5kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViUGFyYW1fa2luZF9mZWF0dXJlIiwgIl9VSV9JV2ViUGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19LSU5ELA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIE5hbWUgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlTmFtZVByb3BlcnR5RGVzY3JpcHRvck9sZChPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlBhcmFtX3R5cGVOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViUGFyYW1fdHlwZU5hbWVfZmVhdHVyZSIsICJfVUlfSVdlYlBhcmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgbnVsbCwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKA0KLQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJCWdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkJZ2V0U3RyaW5nKCJfVUlfSVdlYlBhcmFtX3R5cGVOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViUGFyYW1fdHlwZU5hbWVfZmVhdHVyZSIsICJfVUlfSVdlYlBhcmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJCURvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLA0KLQkJCQkJZmFsc2UsDQotCQkJCQlmYWxzZSwNCi0JCQkJCWZhbHNlLA0KLQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkJbnVsbCwNCi0JCQkJCW51bGwpIA0KLQkJCXsNCi0JCQkJQE92ZXJyaWRlDQotCQkJCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSANCi0JCQkJew0KLQkJCQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsNCi0JCQkJCQ0KLQkJCQkJZmluYWwgT2JqZWN0IHR5cGVTaWduYXR1cmUgPSBzdXBlci5nZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUpOw0KLQkJCQkJaWYgKHR5cGVTaWduYXR1cmUgIT0gbnVsbCkNCi0JCQkJCXsJCQkJCQkNCi0JCQkJCQl0eXBlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyh0eXBlU2lnbmF0dXJlLnRvU3RyaW5nKCkpOwkJCQkJCQ0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCQlyZXR1cm4gdHlwZU5hbWU7DQotCQkJCX0NCi0JCQl9KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcnQgTmFtZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXINCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJQYXJhbV9wYXJ0TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYlBhcmFtX3BhcnROYW1lX2ZlYXR1cmUiLCAiX1VJX0lXZWJQYXJhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1BBUlRfTkFNRSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJIGdldE5hbWVDYXRlZ29yeSgpLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFyZ2V0IE5hbWVzcGFjZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFRhcmdldE5hbWVzcGFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlmaW5hbCBJUHJvcGVydHlTdGF0ZSBzdGF0ZSA9IChJUHJvcGVydHlTdGF0ZSlQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQob2JqZWN0LCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkobmV3IERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViUGFyYW1fdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViUGFyYW1fdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUiLCAiX1VJX0lXZWJQYXJhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UsDQotCQkJCSAoc3RhdGU9PW51bGwpID8gZmFsc2UgOiBzdGF0ZS5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhlYWRlciBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZEhlYWRlclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlBhcmFtX2hlYWRlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYlBhcmFtX2hlYWRlcl9mZWF0dXJlIiwgIl9VSV9JV2ViUGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19IRUFERVIsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIFdlYl9QYXJhbS5naWYuDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSANCi0Jew0KLQkJU3RyaW5nIGltYWdlTmFtZSA9IEltYWdlcy5JTUdfV0VCX1BBUkFNX0lOOw0KLQkJDQotCQlpZiAoKG9iamVjdCBpbnN0YW5jZW9mIElXZWJQYXJhbSkgJiYgKChJV2ViUGFyYW0pIG9iamVjdCkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoInJldHVybiIpKSAvLyROT04tTkxTLTEkDQotCQl7IA0KLQkJCWltYWdlTmFtZSA9IEltYWdlcy5JTUdfV0VCX1BBUkFNX09VVDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIEltYWdlcy5JTlNUQU5DRS5nZXRJbWFnZShpbWFnZU5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgDQotCXsJDQotCQlyZXR1cm4gKChJV2ViUGFyYW0pb2JqZWN0KS5nZXROYW1lKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCi0NCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJV2ViUGFyYW0uY2xhc3MpKSB7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RZUEVfTkFNRToNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fUEFSVF9OQU1FOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVI6DQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCi0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KLQkJcmV0dXJuIERvbVVpLklOU1RBTkNFOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXROYW1lQ2F0ZWdvcnkoKQ0KLQl7DQotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfV2ViUGFyYW1Bbm5vdGF0aW9uQ2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJA0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlNlcnZpY2VJdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViU2VydmljZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODk0MDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViU2VydmljZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTsNCi0NCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGwuRE9NSXRlbVByb3BlcnR5UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZX0gb2JqZWN0Lg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViU2VydmljZUl0ZW1Qcm92aWRlcg0KLQlleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXINCi0JaW1wbGVtZW50cwkNCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkNCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkNCi0JCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KLQkvKioNCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQotCQkNCi0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyAhPSBudWxsKSB7DQotCQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQkJfQ0KLQ0KLQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQ0KLQkJYWRkU2VydmljZUVuZHBvaW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRUYXJnZXROYW1lc3BhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFBvcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRXc2RsTG9jYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCQkNCi0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlRW5kcG9pbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJTZXJ2aWNlX3NlcnZpY2VFbmRwb2ludF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYlNlcnZpY2Vfc2VydmljZUVuZHBvaW50X2ZlYXR1cmUiLCAiX1VJX0lXZWJTZXJ2aWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5ULA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIHRydWUsDQotCQkJCSBudWxsLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgTmFtZXNwYWNlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFyZ2V0TmFtZXNwYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXINCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJTZXJ2aWNlX3RhcmdldE5hbWVzcGFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYlNlcnZpY2VfdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUiLCAiX1VJX0lXZWJTZXJ2aWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IE5hbWUgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkobmV3IERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViU2VydmljZV9wb3J0TmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYlNlcnZpY2VfcG9ydE5hbWVfZmVhdHVyZSIsICJfVUlfSVdlYlNlcnZpY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSwNCi0JCQkJIGdldE5hbWVDYXRlZ29yeSgpLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBMb2NhdGlvbiBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlNlcnZpY2Vfd3NkbExvY2F0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViU2VydmljZV93c2RsTG9jYXRpb25fZmVhdHVyZSIsICJfVUlfSVdlYlNlcnZpY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04sDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIElXZWJTZXJ2aWNlLmdpZi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfV0VCX1NFUlZJQ0UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCi0JCVN0cmluZyBsYWJlbCA9ICgoSVdlYlNlcnZpY2Upb2JqZWN0KS5nZXROYW1lKCk7DQotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCi0JCQlnZXRTdHJpbmcoIl9VSV9JV2ViU2VydmljZV90eXBlIikgOiAvLyROT04tTkxTLTEkDQotCQkJbGFiZWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQotCQkNCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJV2ViU2VydmljZS5jbGFzcykpIHsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVDYXRlZ29yeSgpDQotCXsNCi0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlQW5ub3RhdGlvbkNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU2ODFlN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTsNCi0NCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0fSBvYmplY3QuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcg0KLQlleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXINCi0JaW1wbGVtZW50cwkNCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkNCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkNCi0JCUlJdGVtUHJvcGVydHlTb3VyY2Ugew0KLQkvKioNCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCi0NCi0JCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQl9DQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlNlcnZpY2VQcm9qZWN0X25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJTZXJ2aWNlUHJvamVjdF9uYW1lX2ZlYXR1cmUiLCAiX1VJX0lXZWJTZXJ2aWNlUHJvamVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFLA0KLQkJCQkgbnVsbCwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4NCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yDQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgew0KLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgew0KLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsNCi0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMpOw0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUyk7DQotCQl9DQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCi0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCi0NCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyBJV2ViU2VydmljZVByb2plY3QuZ2lmLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBJbWFnZXMuSU5TVEFOQ0UuZ2V0SW1hZ2UoSW1hZ2VzLklNR19ET01fV1NfUFJPVklERVIpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KLQkJU3RyaW5nIGxhYmVsID0gKChJV2ViU2VydmljZVByb2plY3Qpb2JqZWN0KS5nZXROYW1lKCk7DQotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCi0JCQlnZXRTdHJpbmcoIl9VSV9JV2ViU2VydmljZVByb2plY3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJA0KLQkJCWdldFN0cmluZygiX1VJX0lXZWJTZXJ2aWNlUHJvamVjdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCi0NCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJV2ViU2VydmljZVByb2plY3QuY2xhc3MpKSB7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FOg0KLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUzoNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzoNCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCi0NCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQotCQkJCShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMsDQotCQkJCSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpKSk7DQotDQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcg0KLQkJCQkoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTLA0KLQkJCQkgRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KLQkJcmV0dXJuIERvbVVpLklOU1RBTkNFOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhYjM1YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uRG9tVWk7DQotDQotLyoqDQotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlfSBvYmplY3QuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJUeXBlSXRlbVByb3ZpZGVyDQotCWV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVdlYlR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCi0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgew0KLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsNCi0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQotDQotCQl9DQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyBJV2ViVHlwZS5naWYuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSVdlYlR5cGUiKSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KLQkJU3RyaW5nIGxhYmVsID0gKChJV2ViVHlwZSlvYmplY3QpLmdldE5hbWUoKTsNCi0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KLQkJCWdldFN0cmluZygiX1VJX0lXZWJUeXBlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQNCi0JCQlnZXRTdHJpbmcoIl9VSV9JV2ViVHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsNCi0JCXJldHVybiBEb21VaS5JTlNUQU5DRTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3NWE5MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0ltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTsNCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi0NCi0vKioNCi0gKiBJbWFnZXMgYnVuZGxlLiBVc2UgdGhpcyBjbGFzcyB3aGVuIHlvdSBuZWVkIHRvIGxvYWQgc29tZSBpbWFnZS4gDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbWFnZXMNCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VzIElOU1RBTkNFID0gbmV3IEltYWdlcygpOw0KLQkNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dFQl9NRVRIT0QJCT0gIldlYk1ldGhvZCI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dFQl9QQVJBTV9JTgkJPSAiV2ViUGFyYW1JbiI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dFQl9QQVJBTV9PVVQJPSAiV2ViUGFyYW1PdXQiOyAvLyROT04tTkxTLTEkDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XRUJfU0VSVklDRQkJPSAiV2ViU2VydmljZSI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dFQl9TRVJWSUNFX0dST1VQID0gIldlYlNlcnZpY2VHcm91cCI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFSQkJCQk9ICJTRUkiOyAvLyROT04tTkxTLTEkDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRUlfR1JPVVAJCT0gIlNFSUdyb3VwIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRE9NX1dTX1BST1ZJREVSCT0gIkRPTVdTUHJvdmlkZXIiOyAvLyROT04tTkxTLTEkDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FUlJPUl9NQVJLRVIJCT0gImVycm9yX29iaiI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dBUk5JTkdfTUFSS0VSCT0gIndhcm5pbmdfb2JqIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBpY29uc0J1bmRsZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBtSW1hZ2VSZWdpc3RyeTsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yDQotICAgICAqLw0KLSAgICBwdWJsaWMgSW1hZ2VzKCkgDQotICAgIHsNCi0JCXRyeSB7DQotCQkJaWNvbnNCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLldTSW1hZ2VCdW5kbGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSANCi0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgew0KLQkJCShuZXcgTG9nZ2VyKCkpLmxvZ0Vycm9yKCJVbmFibGUgdG8gbG9hZCBpbWFnZSBidW5kbGUgZm9yIHRoaXMgcGx1Z2luISIsIHgpOyAvLyROT04tTkxTLTEkDQotCQkJaWNvbnNCdW5kbGUgPSBudWxsOw0KLQkJfQ0KLQl9DQotICAgIA0KLSAgICANCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoKSANCi0gICAgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgbUltYWdlUmVnaXN0cnkucHV0KElNR19XRUJfU0VSVklDRSwgZ2V0SW1hZ2VSZXNvdXJjZShpY29uc0J1bmRsZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSU1HX1dFQl9TRVJWSUNFIikpKTsgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1dFQl9TRVJWSUNFX0dST1VQLCBnZXRJbWFnZVJlc291cmNlKGljb25zQnVuZGxlDQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJJTUdfV0VCX1NFUlZJQ0VfR1JPVVAiKSkpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgbUltYWdlUmVnaXN0cnkucHV0KElNR19TRUksIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19TRUkiKSkpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgbUltYWdlUmVnaXN0cnkucHV0KElNR19TRUlfR1JPVVAsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19TRUlfR1JPVVAiKSkpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgbUltYWdlUmVnaXN0cnkucHV0KElNR19ET01fV1NfUFJPVklERVIsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19ET01fV1NfUFJPVklERVIiKSkpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgbUltYWdlUmVnaXN0cnkucHV0KElNR19XRUJfTUVUSE9ELCBnZXRJbWFnZVJlc291cmNlKGljb25zQnVuZGxlDQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJJTUdfV0VCX01FVEhPRCIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1dFQl9QQVJBTV9JTiwgZ2V0SW1hZ2VSZXNvdXJjZShpY29uc0J1bmRsZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSU1HX1dFQl9QQVJBTV9JTiIpKSk7ICAgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1dFQl9QQVJBTV9PVVQsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19XRUJfUEFSQU1fT1VUIikpKTsgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5LnB1dChJTUdfRVJST1JfTUFSS0VSLCBnZXRJbWFnZVJlc291cmNlKGljb25zQnVuZGxlDQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJJTUdfRVJST1JfTUFSS0VSIikpKTsgIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1dBUk5JTkdfTUFSS0VSLCBnZXRJbWFnZVJlc291cmNlKGljb25zQnVuZGxlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJJTUdfV0FSTklOR19NQVJLRVIiKSkpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgDQotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAobmV3IExvZ2dlcigpKS5sb2dFcnJvcigiVW5hYmxlIHRvIGluaXRpYWxpemUgaW1hZ2UgcmVnaXN0cnkgISIsIGUpOyAvLyROT04tTkxTLTEkDQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSANCi0gICAgew0KLSAgICAgICAgaWYgKG1JbWFnZVJlZ2lzdHJ5ID09IG51bGwpIHsNCi0gICAgICAgICAgICBpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gbUltYWdlUmVnaXN0cnk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VOYW1lKSANCi0gICAgew0KLSAgICAgICAgcmV0dXJuIElOU1RBTkNFLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoaW1hZ2VOYW1lKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VSZXNvdXJjZUJ5S2V5KFN0cmluZyByZXNvdXJjZU5hbWUpIHsNCi0gICAgICAgIHJldHVybiBnZXRJbWFnZVJlc291cmNlKGljb25zQnVuZGxlLmdldFN0cmluZyhyZXNvdXJjZU5hbWUpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lKSANCi0gICAgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAlVUkwgdXJsID0gRG9tVWkuZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFJlc291cmNlKHJlc291cmNlTmFtZSk7DQotICAgICAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7DQotICAgICAgICB9IA0KLSAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgew0KLSAgICAgICAgICAgIChuZXcgTG9nZ2VyKCkpLmxvZ0Vycm9yKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJVbmFibGUgdG8gbG9jYXRlIHJlc291cmNlIHswfSEiLHJlc291cmNlTmFtZSksIG5wZSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvaW50ZXJuYWwvaW1wbC9ET01JdGVtUHJvcGVydHlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL2ltcGwvRE9NSXRlbVByb3BlcnR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZiMzIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvaW50ZXJuYWwvaW1wbC9ET01JdGVtUHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGw7DQotDQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMuUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUuUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEV4dGVuZHMge0BsaW5rIFByb3BlcnR5RGVzY3JpcHRvcn0gdG8gcmVwcmVzZW50IHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIERPTSBvYmplY3RzLiANCi0gKiBUaGlzIGNsYXNzIG92ZXJyaWRlcyBjcmVhdGVQcm9wZXJ0eVZhbHVlV3JhcHBlciBmb3JtIHtAbGluayBQcm9wZXJ0eURlc2NyaXB0b3J9IHRvIHByb3ZpZGUNCi0gKiBjdXN0b20gcHJvcGVydHkgd3JhcHBlciBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3BlcnR5RGVzY3JpcHRvciANCi17DQotCXB1YmxpYyBET01JdGVtUHJvcGVydHlQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwNCi0JCQkJUmVzb3VyY2VMb2NhdG9yIHJlc291cmNlTG9jYXRvciwgDQotCQkJCVN0cmluZyBkaXNwbGF5TmFtZSwNCi0JCQkJU3RyaW5nIGRlc2NyaXB0aW9uLCANCi0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIA0KLQkJCQlib29sZWFuIGlzU2V0dGFibGUsDQotCQkJCWJvb2xlYW4gbXVsdGlMaW5lLCANCi0JCQkJYm9vbGVhbiBzb3J0Q2hvaWNlcywgDQotCQkJCU9iamVjdCBzdGF0aWNJbWFnZSwNCi0JCQkJU3RyaW5nIGNhdGVnb3J5LCANCi0JCQkJU3RyaW5nW10gZmlsdGVyRmxhZ3MpIA0KLQl7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgcmVzb3VyY2VMb2NhdG9yLCBkaXNwbGF5TmFtZSwgZGVzY3JpcHRpb24sIGZlYXR1cmUsDQotCQkJCWlzU2V0dGFibGUsIG11bHRpTGluZSwgc29ydENob2ljZXMsIHN0YXRpY0ltYWdlLCBjYXRlZ29yeSwgZmlsdGVyRmxhZ3MpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVByb3BlcnR5VmFsdWVXcmFwcGVyKE9iamVjdCBvYmplY3QsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSANCi0Jew0KLQkJcmV0dXJuIG5ldyBET01Qcm9wZXJ0eVZhbHVlKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIHByb3BlcnR5VmFsdWUsIG51bGwpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gY2FuU2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCkNCi0Jew0KLQkJZmluYWwgSVByb3BlcnR5U3RhdGUgc3RhdGUgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KG9iamVjdCwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJaWYgKHN0YXRlICE9IG51bGwpIHsNCi0JCQlzdXBlci5pc1NldHRhYmxlID0gc3RhdGUuaXNDaGFuZ2VhYmxlKGZlYXR1cmUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gc3VwZXIuY2FuU2V0UHJvcGVydHkob2JqZWN0KTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmplY3QpDQotCXsNCi0JCWZpbmFsIElQcm9wZXJ0eURlZmF1bHRzIGRlZmF1bHRzID0gKElQcm9wZXJ0eURlZmF1bHRzKVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChvYmplY3QsIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzKTsNCi0JCWlmIChkZWZhdWx0cyAhPSBudWxsKSB7DQotCQkJZmluYWwgT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRzLmdldERlZmF1bHQoZmVhdHVyZSk7DQotCQkJKChFT2JqZWN0KW9iamVjdCkuZVNldChmZWF0dXJlLCBkZWZhdWx0VmFsdWUpOw0KLQkJfSANCi0JCWVsc2Ugew0KLQkJCXN1cGVyLnJlc2V0UHJvcGVydHlWYWx1ZShvYmplY3QpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9pbXBsL0RPTVByb3BlcnR5VmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9pbXBsL0RPTVByb3BlcnR5VmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRjNTIxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvaW50ZXJuYWwvaW1wbC9ET01Qcm9wZXJ0eVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSURPTVByb3BlcnR5VmFsdWU7DQotDQotLyoqDQotICogSW1wbGVtZW50b3Igb2Yge0BsaW5rIElET01Qcm9wZXJ0eVZhbHVlfS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIERPTVByb3BlcnR5VmFsdWUgZXh0ZW5kcyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlByb3BlcnR5VmFsdWVXcmFwcGVyIGltcGxlbWVudHMgSURPTVByb3BlcnR5VmFsdWUgDQotew0KLQlwdWJsaWMgRE9NUHJvcGVydHlWYWx1ZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IG9iamVjdCwgT2JqZWN0IHByb3BlcnR5VmFsdWUsIE9iamVjdCBuZXN0ZWRQcm9wZXJ0eVNvdXJjKSANCi0Jew0KLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgcHJvcGVydHlWYWx1ZSwgbmVzdGVkUHJvcGVydHlTb3VyYyk7DQotCX0NCi0NCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkgew0KLQkJcmV0dXJuIGdldEVkaXRhYmxlVmFsdWUobnVsbCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL3BsdWdpbi9Eb21VaS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL3BsdWdpbi9Eb21VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOWE1NzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9wbHVnaW4vRG9tVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIERvbSBlZGl0IHBsdWdpbi4NCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgRG9tVWkgZXh0ZW5kcyBFTUZQbHVnaW4NCi17DQotCS8qKg0KLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvbVVpIElOU1RBTkNFID0gbmV3IERvbVVpKCk7DQotDQotCS8qKg0KLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIERvbVVpKCkNCi0Jew0KLQkJc3VwZXINCi0JCSAgKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10gDQotCQkgICB7DQotCQkgICB9KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkNCi0Jew0KLQkJcmV0dXJuIHBsdWdpbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKQ0KLQl7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbg0KLQl7DQotCQkvKioNCi0JCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCXB1YmxpYyBJbXBsZW1lbnRhdGlvbigpDQotCQl7DQotCQkJc3VwZXIoKTsNCi0NCi0JCQkvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLg0KLQkJCS8vDQotCQkJcGx1Z2luID0gdGhpczsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKiANCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFBsdWdpbiBnZXREZWZhdWx0KCkNCi0Jew0KLQkJcmV0dXJuIHBsdWdpbjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvaW50ZXJuYWwvcGx1Z2luL1dTSW1hZ2VCdW5kbGUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9wbHVnaW4vV1NJbWFnZUJ1bmRsZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNGFhZjAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9wbHVnaW4vV1NJbWFnZUJ1bmRsZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLUlNR19XRUJfU0VSVklDRT1pY29ucy9XZWJfU2VydmljZS5naWYNCi1JTUdfV0VCX1NFUlZJQ0VfR1JPVVA9aWNvbnMvV2ViX1NlcnZpY2VfR3JvdXAuZ2lmDQotSU1HX1NFST1pY29ucy9TRUkuZ2lmDQotSU1HX1NFSV9HUk9VUD1pY29ucy9TRUlfR3JvdXAuZ2lmDQotSU1HX0RPTV9XU19QUk9WSURFUj1pY29ucy9XZWJfU2VydmljZV9JdGVtX1Byb3ZpZGVyLmdpZg0KLUlNR19XRUJfTUVUSE9EPWljb25zL1dlYl9NZXRob2QuZ2lmDQotSU1HX1dFQl9QQVJBTV9JTj1pY29ucy9XZWJfUGFyYW1fSW4uZ2lmDQotSU1HX1dFQl9QQVJBTV9PVVQ9aWNvbnMvV2ViX1BhcmFtX091dC5naWYNCi1JTUdfRVJST1JfTUFSS0VSPWljb25zL2Vycm9yX29iai5naWYNCi1JTUdfV0FSTklOR19NQVJLRVI9aWNvbnMvd2FybmluZ19vYmouZ2lmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E5OTA5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlsczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1MTI1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscztzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsDQotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLA0KLSBvcmcuZWNsaXBzZS50ZXh0LA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UudWkuaWRlLA0KLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSwNCi0gb3JnLmFwYWNoZS5heGlzDQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuY2xhenosDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmV4Y2VwdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcw0KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5wbHVnaW4uSmF4d3NVdGlsc1BsdWdpbg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDEwYWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDE1LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhYWUyNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTRiNDBkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPVV0aWxzUGx1Z2luIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDI5MzA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4NCi08IS0tDQotICAgIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICANCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIC0tPg0KLQ0KLTxwbHVnaW4+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zdGFydHVwIj4NCi0gICAgICA8c3RhcnR1cD48L3N0YXJ0dXA+DQotICAgPC9leHRlbnNpb24+DQotDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9Db250cmFjdENoZWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvQ29udHJhY3RDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmMTNiOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9Db250cmFjdENoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlsczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotLyoqDQotICogQ29udGFpbnMgY2hlY2tzIGZyZXF1ZW50bHkgYXBwbGllZCBvbiBwYXJhbWV0ZXJzLg0KLSAqIA0KLSAqIEBhdXRob3IgSm9lcmcgRGVobWVsDQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyYWN0Q2hlY2tlcg0KLXsNCi0JcHJpdmF0ZSBDb250cmFjdENoZWNrZXIoKQ0KLQl7DQotCQkvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24gZnJvbSBvdXRzaWRlDQotCX0NCi0JDQotCS8qKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhcmFtZXRlciB2YWx1ZSBpcyBudWxsIGFuZCByZXBvcnRzIGFuIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPg0KLQkgKiBpbiB0aGlzIGNhc2UuDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEBwYXJhbSBwYXJhbU5hbWUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLCB1c2VkIHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB0aGUgdXNlcg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biBlaXRoZXIgdGhlIHBhcmFtVmFsdWUgb3IgcGFyYW1OYW1lIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja1BhcmFtKGZpbmFsIE9iamVjdCBwYXJhbVZhbHVlLCBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lKQ0KLQl7DQotCQlpZiAocGFyYW1OYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbU5hbWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkIA0KLQkJfQ0KLQkJaWYgKHBhcmFtVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24ocGFyYW1OYW1lICsgIiBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQgDQotCQl9DQotCX0NCi0JDQotCS8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHZhbHVlIGlzIG51bGwgYW5kIHJlcG9ydHMgYW4gPGNvZGU+TnVsbFBvaW50ZXJFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIHBhcmFtVmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHBhcmFtVmFsdWUgaXMgbnVsbCAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbnVsbENoZWNrUGFyYW0oZmluYWwgT2JqZWN0IHBhcmFtVmFsdWUpDQotCXsNCi0JCWlmIChwYXJhbVZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbVZhbHVlIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWVsZCB2YWx1ZSBpcyBudWxsIGFuZCByZXBvcnRzIGFuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4NCi0JICogaW4gdGhpcyBjYXNlLg0KLQkgKiBAcGFyYW0gZmllbGRWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZA0KLQkgKiBAcGFyYW0gZmllbGROYW1lIG5hbWUgb2YgdGhlIGZpZWxkLCB1c2VkIHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB0aGUgdXNlcg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biBpZiB0aGUgZmllbGROYW1lIGlzIG51bGwNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBmaWVsZFZhbHVlIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja0ZpZWxkKGZpbmFsIE9iamVjdCBmaWVsZFZhbHVlLCBmaW5hbCBTdHJpbmcgZmllbGROYW1lKQ0KLQl7DQotCQlpZiAoZmllbGROYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmaWVsZE5hbWUgbXVzdCBub3QgYmUgbnVsbCIpOyAgLy8kTk9OLU5MUy0xJCAgDQotCQl9DQotCQlpZiAoZmllbGRWYWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZmllbGROYW1lICsgIiBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQgDQotCQl9DQotCX0NCi0JDQotCS8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZmllbGQgdmFsdWUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIGZpZWxkVmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBmaWVsZFZhbHVlIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja0ZpZWxkKGZpbmFsIE9iamVjdCBmaWVsZFZhbHVlKQ0KLQl7DQotCQlpZiAoZmllbGRWYWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZpZWxkVmFsdWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0JDQotCS8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgb2YgYSBsb2NhbCB2YXJpYWJsZSBpcyBudWxsIGFuZCByZXBvcnRzIGFuIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4NCi0JICogaW4gdGhpcyBjYXNlLg0KLQkgKiBAcGFyYW0gdmFyVmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQNCi0JICogQHBhcmFtIHZhck5hbWUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUsIHVzZWQgdG8gcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHRoZSB1c2VyDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIGlmIHRoZSB2YXJOYW1lIGlzIG51bGwNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhyb3duIGlmIHRoZSB2YXJWYWx1ZSBpcyBudWxsICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBudWxsQ2hlY2tWYXJpYWJsZShmaW5hbCBPYmplY3QgdmFyVmFsdWUsIGZpbmFsIFN0cmluZyB2YXJOYW1lKQ0KLQl7DQotCQlpZiAodmFyTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFyTmFtZSBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQgDQotCQl9DQotCQlpZiAodmFyVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHZhck5hbWUgKyAiIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIG9mIGEgbG9jYWwgdmFyaWFibGUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIHZhclZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdmFyVmFsdWUgaXMgbnVsbCAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbnVsbENoZWNrVmFyaWFibGUoZmluYWwgT2JqZWN0IHZhclZhbHVlKQ0KLQl7DQotCQlpZiAodmFyVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ2YXJWYWx1ZSBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiA8Y29kZT5wYXJhbTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkgc3RyaW5nLg0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHBhcmFtIHZhck5hbWUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnBhcmFtPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnBhcmFtPC9jb2RlPiBpcyBlbXB0eSBzdHJpbmcgb3IgY29udGFpbnMgb25seQ0KLQkgKiB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW1wdHlTdHJpbmdDaGVja1BhcmFtKGZpbmFsIFN0cmluZyBwYXJhbSwgZmluYWwgU3RyaW5nIHZhck5hbWUpIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShwYXJhbSwgdmFyTmFtZSk7DQotCQkNCi0JCWlmIChwYXJhbS50cmltKCkubGVuZ3RoKCkgPT0gMCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlBhcmFtZXRlciB7MH0gaXMgZW1wdHkgc3RyaW5nIG9yIGNvbnRhaW5zIG9ubHkgd2hpdGUgc3BhY2VzIiwgdmFyTmFtZSkpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9KYXhXc1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL0pheFdzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVkZGU3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL0pheFdzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlsczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotDQotLyoqDQotICogVXRpbGl0eSB0aGF0IGNvbnRhaW5zIEpBWC1XUyByZWxlYXRlZCBmdW5jdGlvbmFsaXR5DQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF4V3NVdGlscw0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fU1VGRklYID0gIkJlYW4iOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1NVRkZJWCA9ICJQb3J0IjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TVUZGSVggPSAiU2VydmljZSI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCXByaXZhdGUgSmF4V3NVdGlscygpDQotCXsNCi0JCS8vIGhpZGUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KLQl9DQotDQotCS8qKg0KLQkgKiBBbiB1dGlsaXR5IG1ldGhvZCBmb3IgY29tcG9zaW5nIGEgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGZvciBKYXhXcyBjdXN0b21pemF0aW9uDQotCSAqIG91dCBvZiBhIHBhY2thZ2UgbmFtZS4NCi0JICogQWxnb3JpdGhtOg0KLQkgKiA8bGk+SW4gY2FzZSB0aGUgcGFja2FnZSBoYXMgMCBmcmFnbWVudCAoZGVmYXVsdCBwYWNrYWdlKSB0aGUgcmVzdWx0IHdvdWxkIGJlIGh0dHA6Ly8vPC9saT4NCi0JICogPGxpPkluIGNhc2UgdGhlIHBhY2thZ2UgaGFzIDEgZnJhZ21lbnQgdGhlIHJlc3VsdCB3b3VsZCBiZSBodHRwOi8vZnJhZ21lbnQxLzwvbGk+DQotCSAqIDxsaT5JbiBjYXNlIHRoZSBwYWNrYWdlIGhhcyAyIGZyYWdtZW50cyB0aGUgcmVzdWx0IHdvdWxkIGJlIGh0dHA6Ly9mcmFnbWVudDIuZnJhZ21lbnQxLzwvbGk+DQotCSAqIDxsaT5JbiBjYXNlIHRoZSBwYWNrYWdlIGhhcyBtb3JlIHRoYW4gMiBmcmFnbWVudHMgdGhlIHJlc3VsdCB3b3VsZCBiZSBodHRwOi8vZnJhZ21lbnQyLmZyYWdtZW50MS9mcmFnbWVudDMvZnJhZ21lbnQ0Ly4uLi9mcmFnbWVudG4vPC9saT4NCi0JICogQHBhcmFtIHBhY2thZ2VOYW1lIE5hbWUgb2YgdGhlIHBhY2thZ2UNCi0JICogQHJldHVybiB0aGUgY29tcG9zZWQgbmFtZXNwYWNlDQotCSAqIEB0aG9yd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBwYWNrYWdlIG5hbWUgc3BlY2lmaWVkIGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpDQotCXsNCi0JCWlmKHBhY2thZ2VOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJQYWNrYWdlIG5hbWUgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlTdHJpbmdbXSBwa2dGcmFnbWVudHMgPSBwYWNrYWdlTmFtZS5zcGxpdCgiXFwuIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYocGtnRnJhZ21lbnRzLmxlbmd0aCA+IDEpDQotCQl7DQotCQkJLy8gcmV2ZXJzZSB0aGUgZmlyc3QgdHdvIGZyYWdtZW50cyBpbiBjYXNlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gZnJhZ21lbnRzIGF2YWlsYWJsZQ0KLQkJCVN0cmluZyBmcmFnMCA9IHBrZ0ZyYWdtZW50c1swXTsNCi0JCQlwa2dGcmFnbWVudHNbMF0gPSBwa2dGcmFnbWVudHNbMV07DQotCQkJcGtnRnJhZ21lbnRzWzFdID0gZnJhZzA7DQotCQl9DQotCQkNCi0JCVN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoImh0dHA6Ly8iKTsgLy8kTk9OLU5MUy0xJA0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwa2dGcmFnbWVudHMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJcmVzdWx0LmFwcGVuZChwa2dGcmFnbWVudHNbaV0pOw0KLQkJCXJlc3VsdC5hcHBlbmQoaT09MCAmJiBwa2dGcmFnbWVudHMubGVuZ3RoPjEgPyAiLiIgOiAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2FtZSBhcyBjb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoKSBidXQgZmlyc3QgZXh0cmFjdHMgdGhlIHBhY2thZ2Ugb3V0IG9mIGNsYXNzDQotCSAqIGZ1bGx5IHF1YWxpZmllZCBuYW1lDQotCSAqIEBwYXJhbSBmcU5hbWUgdGhlIGNsYXNzIGZ1bGx5IHF1YWxpZmllZCBuYW1lDQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCB0YXJnZXQgbmFtZXNwYWNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeUZRTmFtZShTdHJpbmcgZnFOYW1lKQ0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZnFOYW1lLCAiZnFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJldHVybiBjb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoZXh0cmFjdFBhY2thZ2UoZnFOYW1lKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBQb3J0VHlwZSBuYW1lIGZyb20gdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gYW5kIDxjb2RlPnNlaU5hbWU8L2NvZGU+Lg0KLQkgKiBAcGFyYW0gZW5kcG9pbnQgY2xhc3MuDQotCSAqIEBwYXJhbSBzZWlOYW1lDQotCSAqIEByZXR1cm4gUG9ydFR5cGUgbmFtZSBmb3IgdGhlIEBXZWJTZXJ2aWNlIGFubm90YXRpb24sIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IHdpdGggdGhlICJQb3J0IiBzdWZmaXguDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IHNwZWNpZmllZCBpcyBudWxsLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UG9ydHR5cGVOYW1lKElUeXBlIGVuZHBvaW50VHlwZSwgU3RyaW5nIHNlaU5hbWUpDQotCXsNCi0JCWlmKGVuZHBvaW50VHlwZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZW5kcG9pbnRUeXBlIGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZihzZWlOYW1lICE9IG51bGwgJiYgc2VpTmFtZS5sZW5ndGgoKSA+IDApDQotCQl7DQotCQkJcmV0dXJuIHNlaU5hbWU7DQotCQl9DQotCQkNCi0JCXJldHVybiByZW1vdmVCZWFuU3VmZml4SWZSZXF1aXJlZChlbmRwb2ludFR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIHRoZSAiQmVhbiIgc3VmZml4IGZyb20gdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gaW4gY2FzZSBpdCBpcyBwcmVzZW50IGFuZCBnZW5lcmF0ZXMgU2VydmljZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIElUeXBlLg0KLQkgKiBAcGFyYW0gZW5kcG9pbnQgY2xhc3MuDQotCSAqIEByZXR1cm4gU2VydmljZSBuYW1lIGZvciB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiwgdGhlIG5hbWUgb2YgdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gd2l0aG91dCB0aGUgIkJlYW4iIHN1ZmZpeCBhbmQgPGNvZGU+IlNlcnZpY2UiPC9jb2RlPiBhdCB0aGUgZW5kLg0KLQkgKiBJbiBjYXNlIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IGVxdWFscyAiQmVhbiIgdGhlbiB0aGUgb3JpZ2luYWwgbmFtZSBpcyByZXR1cm5lZCB3aXRoIDxjb2RlPiJTZXJ2aWNlIjwvY29kZT4gYXRlIHRoZSBlbmQuDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IHNwZWNpZmllZCBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZShmaW5hbCBJVHlwZSBlbmRwb2ludFR5cGUpDQotCXsNCi0JCWlmKGVuZHBvaW50VHlwZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZW5kcG9pbnRUeXBlIGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJldHVybiByZW1vdmVCZWFuU3VmZml4SWZSZXF1aXJlZChlbmRwb2ludFR5cGUuZ2V0RWxlbWVudE5hbWUoKSkgKyBTRVJWSUNFX1NVRkZJWDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVtb3ZlcyB0aGUgIkJlYW4iIHN1ZmZpeCBmcm9tIHRoZSBlbmRwb2ludCBuYW1lIGluIGNhc2UgaXQgaXMgcHJlc2VudC4gIA0KLQkgKiBAcGFyYW0gZW5kcG9pbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludA0KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludCB3aXRob3V0IHRoZSAiQmVhbiIgc3VmZml4LiBJbiBjYXNlIHRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludCBlcXVhbHMgIkJlYW4iIHRoZW4gdGhlIG9yaWdpbmFsIG5hbWUgaXMgcmV0dXJuZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZW1vdmVCZWFuU3VmZml4SWZSZXF1aXJlZChmaW5hbCBTdHJpbmcgZW5kcG9pbnROYW1lKQ0KLQl7DQotCQlhc3NlcnQgZW5kcG9pbnROYW1lICE9IG51bGwgJiYgZW5kcG9pbnROYW1lLmxlbmd0aCgpID4gMDsNCi0JCQ0KLQkJaWYoZW5kcG9pbnROYW1lLmVxdWFscyhCRUFOX1NVRkZJWCkpDQotCQl7DQotCQkJcmV0dXJuIGVuZHBvaW50TmFtZTsNCi0JCX0NCi0JCQ0KLQkJaWYoZW5kcG9pbnROYW1lLmVuZHNXaXRoKEJFQU5fU1VGRklYKSkNCi0JCXsNCi0JCQlyZXR1cm4gZW5kcG9pbnROYW1lLnN1YnN0cmluZygwLCBlbmRwb2ludE5hbWUubGFzdEluZGV4T2YoQkVBTl9TVUZGSVgpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGVuZHBvaW50TmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgUG9ydCBuYW1lIGZyb20gdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4uDQotCSAqIEBwYXJhbSBlbmRwb2ludCBjbGFzcy4NCi0JICogQHJldHVybiBQb3J0IG5hbWUgZm9yIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uLCB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiB3aXRoIHRoZSAiUG9ydCIgc3VmZml4Lg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBzcGVjaWZpZWQgaXMgbnVsbC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBvcnROYW1lKGZpbmFsIElUeXBlIGVuZHBvaW50VHlwZSkNCi0Jew0KLQkJcmV0dXJuIGdldERlZmF1bHRQb3J0TmFtZShlbmRwb2ludFR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNlcnZpY2UgbmFtZSBjYWxjdWxhdGVkIGFzIHRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcy4NCi0JICogQHBhcmFtIGZxTmFtZQ0KLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHNlcnZpY2UgbmFtZQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKGZpbmFsIFN0cmluZyBmcU5hbWUpDQotCXsNCi0JCWlmKGZxTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZW5kcG9pbnRUeXBlIGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJldHVybiBleHRyYWN0U2hvcnROYW1lKGZxTmFtZSkgKyBTRVJWSUNFX1NVRkZJWDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgd3NkbDpwb3J0VHlwZSBuYW1lIGRlZmluZWQgYXMgSkFYLVdTIHNwZWNpZmljYXRpb24gc3RhdGVzLiANCi0JICogQHBhcmFtIGZxTmFtZQ0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UG9ydHR5cGVOYW1lKGZpbmFsIFN0cmluZyBmcU5hbWUpDQotCXsNCi0JCWlmKGZxTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZnFOYW1lIGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJldHVybiBleHRyYWN0U2hvcnROYW1lKGZxTmFtZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgbmFtZSBmb3IgYSB3c2RsOnBvcnQgZGVmaW5lZCBhcyBKQVgtV1Mgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgDQotCSAqIEBwYXJhbSBmcU5hbWUNCi0JICogQHJldHVybiB0aGUgY2FsY3VsYXRlZCBuYW1lDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UG9ydE5hbWUoZmluYWwgU3RyaW5nIGZxTmFtZSkNCi0Jew0KLQkJaWYoZnFOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmcU5hbWUgY291bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBleHRyYWN0U2hvcnROYW1lKGZxTmFtZSkgKyBQT1JUX1NVRkZJWDsNCi0JfQkNCi0JDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBleHRyYWN0U2hvcnROYW1lKFN0cmluZyBmcU5hbWUpIA0KLQl7DQotCQlpbnQgcG9zID0gZnFOYW1lLmxhc3RJbmRleE9mKCcuJyk7DQotCQlpZiAocG9zID09LTEgKSB7DQotCQkJcmV0dXJuIGZxTmFtZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZxTmFtZS5zdWJzdHJpbmcocG9zKzEpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFBhY2thZ2UoZmluYWwgU3RyaW5nIGZxTmFtZSkgDQotCXsNCi0JCWludCBwb3MgPSBmcU5hbWUubGFzdEluZGV4T2YoJy4nKTsNCi0JCWlmIChwb3MgPT0tMSApIHsNCi0JCQlyZXR1cm4gZnFOYW1lOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZnFOYW1lLnN1YnN0cmluZygwLCBwb3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvU3RhdHVzVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvU3RhdHVzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM3NzlhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL1N0YXR1c1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotDQotDQotLyoqDQotICogQ29udmVuaWVuY2UgbWV0aG9kcyB0byBtYW5hZ2Ugc3RhdHVzIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBKb2VyZyBEZWhtZWwNCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdHVzVXRpbHMNCi17DQotCXByaXZhdGUgU3RhdHVzVXRpbHMoKQ0KLQl7DQotCQkvLyBubyBpbnN0YW50aWF0aW9uDQotCX0NCi0JDQotCS8qKg0KLQkgKiBGaW5kcyB0aGUgbW9zdCBzZXZlcmUgc3RhdHVzIGZyb20gYSBhcnJheSBvZiBzdGF0aS4NCi0JICogQW4gZXJyb3IgaXMgbW9yZSBzZXZlcmUgdGhhbiBhIHdhcm5pbmcsIGFuZCBhIHdhcm5pbmcgaXMgbW9yZSBzZXZlcmUNCi0JICogdGhhbiBvay4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBnZXRNb3N0U2V2ZXJlKElTdGF0dXNbXSBzdGF0dXMpIHsNCi0JCUlTdGF0dXMgbWF4PSBudWxsOw0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IHN0YXR1cy5sZW5ndGg7IGkrKykgew0KLQkJCUlTdGF0dXMgY3Vycj0gc3RhdHVzW2ldOw0KLQkJCWlmIChjdXJyLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsNCi0JCQkJcmV0dXJuIGN1cnI7DQotCQkJfQ0KLQkJCWlmIChtYXggPT0gbnVsbCB8fCBjdXJyLmdldFNldmVyaXR5KCkgPiBtYXguZ2V0U2V2ZXJpdHkoKSkgew0KLQkJCQltYXg9IGN1cnI7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG1heDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLkNBTkNFTC4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHJldHVybiB0aGUgY2FuY2VsIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c0NhbmNlbChmaW5hbCBTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkNBTkNFTCwgbWVzc2FnZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLkVSUk9SLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNFcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuRVJST1IuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEBwYXJhbSBleA0KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdGF0dXMNCi0JICogQHJldHVybiB0aGUgZXJyb3Igc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBleCkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBleCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLldBUk5JTkcuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gdGhlIHdhcm5pbmcgc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzV2FybmluZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIG1lc3NhZ2UpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5XQVJOSU5HLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gZXgNCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3RhdHVzDQotCSAqIEByZXR1cm4gdGhlIHdhcm5pbmcgc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzV2FybmluZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGV4KQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSwgZXgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5JTkZPLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSBpbmZvIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c0luZm8oZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5JTkZPLCBtZXNzYWdlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLklORk8uDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gdGhlIGluZm8gc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzSW5mbyhmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuSU5GTywgbWVzc2FnZSwgY2F1c2UpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuT0suDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gdGhlIG9rIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c09rKGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIG1lc3NhZ2UpOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGZpbmFsIGludCBzZXZlcml0eSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCAiaWQiLCAwLCBtZXNzYWdlLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGZpbmFsIGludCBzZXZlcml0eSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBleCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksICJpZCIsIDAsIG1lc3NhZ2UsIGV4KTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotCQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgbXVsdGlzdGF0dXMgb2JqZWN0DQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gbXVsdGlzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgTXVsdGlTdGF0dXMgY3JlYXRlTXVsdGlTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBuZXcgTXVsdGlTdGF0dXMoImlkIiwgMCwgbWVzc2FnZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL1dzZGxOYW1lc1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9Xc2RsTmFtZXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTdkZDNmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL1dzZGxOYW1lc1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMudHlwZXMuTkNOYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotDQotDQotLyoqDQotICogQ2xhc3MgdGhhdCBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgdG8gdmFsaWRhdGUgbmFtZXMgdXNlZCBpbiBXU0RMLiAgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc2RsTmFtZXNWYWxpZGF0b3IgDQotew0KLQkvKioNCi0JICogUHJvdmlkZXMgdmFsaWRhdGlvbiBvZiBOQ05hbWUgDQotCSAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgZm9yIHRoZSBlcnJvciBtZXNzYWdlDQotCSAqIEBwYXJhbSBuYW1lIHRoZSBjaGVja2VkIG5hbWUNCi0JICogQHJldHVybiBlcnJvciBzdGF0dXMgaW4gY2FzZSB0aGUgbmFtZSBpcyBpbnZhbGlkIG90aGVyd2lzZSB7QGxpbmsgU3RhdHVzI09LX1NUQVRVU30uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVOQ05hbWUoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJaWYgKG5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsNCi0JCQlyZXR1cm4gU3RhdHVzVXRpbHMuc3RhdHVzRXJyb3IoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NVdGlsTWVzc2FnZXMuV3NkbE5hbWVzVmFsaWRhdG9yX0VtcHR5WG1sTmFtZSwgdGl0bGUpKTsNCi0JCX0NCi0JCQ0KLQkJaW50IGVyclBvcyA9IGNoZWNrTkNOYW1lKG5hbWUpOw0KLQkJaWYgKGVyclBvcyA+IC0xKSB7DQotCQkJcmV0dXJuIFN0YXR1c1V0aWxzLnN0YXR1c0Vycm9yKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLldzZGxOYW1lc1ZhbGlkYXRvcl9JbnZhbGlkTkNOYW1lLCBuYW1lLmNoYXJBdChlcnJQb3MpLCB0aXRsZSwgbmFtZSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBWYWxpZGF0ZXMgPGNvZGU+bmFtZTwvY29kZT4gZm9yIE5DTmFtZQ0KLQkgKiBAcGFyYW0gbmFtZQ0KLQkgKiBAcmV0dXJuIC0xIGlmIHRoZSBuYW1lIGlzIHZhbGlkIG9yID4gLTEgd2hpY2ggaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB3cm9uZyBjaGFyYWN0ZXIuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVOQ05hbWUyKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG5hbWUpIA0KLQl7DQotCQlpZiAobmFtZT09bnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7DQotCQkJcmV0dXJuIFN0YXR1c1V0aWxzLnN0YXR1c0Vycm9yKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLldzZGxOYW1lc1ZhbGlkYXRvcl9FbXB0eVhtbE5hbWUyLCB0aXRsZSkpOw0KLQkJfQ0KLQkJDQotCQlpbnQgZXJyUG9zID0gY2hlY2tOQ05hbWUobmFtZSk7DQotCQlpZiAoZXJyUG9zID4gLTEpIHsNCi0JCQlyZXR1cm4gU3RhdHVzVXRpbHMuc3RhdHVzRXJyb3IoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NVdGlsTWVzc2FnZXMuV3NkbE5hbWVzVmFsaWRhdG9yX0ludmFsaWROQ05hbWUyLCBuYW1lLmNoYXJBdChlcnJQb3MpLCB0aXRsZSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBuYW1lIHNwZWNpZmllZCBpcyBhIHZhbGlkIE5DTmFtZQ0KLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBjaGVjaw0KLQkgKiBAcmV0dXJuIGluZGV4IG9mIHRoZSBmaXJzdCBzeW1ib2wgd2hpY2ggdmlvbGF0ZXMgdGhlIE5DTmFtZSBydWxlcyBvciAtMSBpbiBjYXNlIHRoZSBuYW1lIGlzIGEgdmFsaWQgTkNOYW1lDQotCSAqIEBzZWUgTkNOYW1lI2lzVmFsaWQoU3RyaW5nKQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrTkNOYW1lKGZpbmFsIFN0cmluZyBuYW1lKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KLQkJZm9yKGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykNCi0JCXsNCi0JCQlidWlsZGVyLmFwcGVuZChuYW1lLmNoYXJBdChpKSk7DQotCQkJaWYoIU5DTmFtZS5pc1ZhbGlkKGJ1aWxkZXIudG9TdHJpbmcoKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gaTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiAtMTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmMmZkMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5BcnJheVZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQm9vbGVhblZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQ2xhc3NWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkludGVnZXJWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlBhcmFtVmFsdWVQYWlySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuUXVhbGlmaWVkTmFtZVZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuU3RyaW5nVmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgY2xhc3MgY29udGFpbmluZyBjb21tb24gZmFjdG9yeSBhbmQgdXRpbGl0eSBtZXRob2RzIEFubm90YXRpb24gcHJvY2Vzc2luZy4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZhY3RvcnkNCi17DQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggQW5ub3RhdGlvbiwgZS5nLiBBbm5vdGF0aW9uIG9mIGtpbmQgXEBXZWJTZXJ2aWNlKHBhcmFtMT0idmFsdWUxIiwgcGFyYW0yPSJ2YWx1ZTIiKS4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUNCi0JICogQHBhcmFtIHBhcmFtVmFsdWVQYWlycw0KLQkgKiANCi0JICogQHJldHVybiBJbnN0YW50aWF0ZWQgQW5ub3RhdGlvbiBvZiB0eXBlIElDb21wbGV4QW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8dHQ+YW5ub3RhdGlvblFOYW1lPC90dD4gb3IgPHR0PnBhcmFtVmFsdWVQYWlyczwvdHQ+IGFyZSBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDx0dD5hbm5vdGF0aW9uUU5hbWU8L3R0PiBpcyBlbXB0eSBTdHJpbmcuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBJQW5ub3RhdGlvbjxUPiBjcmVhdGVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uUU5hbWUsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycywgZmluYWwgVCBhcHBsaWVkRWxlbWVudCkNCi0Jew0KLQkJaWYgKGFubm90YXRpb25RTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYgKGFubm90YXRpb25RTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbm5vdGF0aW9uUU5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmchIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWlmIChwYXJhbVZhbHVlUGFpcnMgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhcmFtVmFsdWVQYWlycyBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWZpbmFsIEFubm90YXRpb25JbXBsPFQ+IGltcGwgPSBuZXcgQW5ub3RhdGlvbkltcGw8VD4oYW5ub3RhdGlvblFOYW1lLCBwYXJhbVZhbHVlUGFpcnMpOw0KLQkJaW1wbC5zZXRKYXZhRWxlbWVudChhcHBsaWVkRWxlbWVudCk7DQotCQkNCi0JCXJldHVybiBpbXBsOw0KLQl9DQotCQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElBbm5vdGF0aW9ufSBpbnN0YW5jZSB0aGF0IHJlZmVyZW5jZXMgPGNvZGU+YXBwbGllZEVsZW1lbnQ8L2NvZGU+IGphdmEgZWxlbWVudCANCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZSB0aGUgYW5ub3RhdGlvbiBuYW1lDQotCSAqIEBwYXJhbSBhcHBsaWVkRWxlbWVudCB0aGUgamF2YSBlbGVtZW50IHRoYXQgdGhpcyBhbm5vdGF0aW9uIGlzIGFwcGxpZWQgb24NCi0JICogQHBhcmFtIHBhcmFtVmFsdWVQYWlycyB0aGUgYW5ub3RhdGlvbiBhdHRyaWJ1dGVzDQotCSAqIEByZXR1cm4ge0BsaW5rIElBbm5vdGF0aW9ufSBpbnN0YW5jZQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2Ugc29tZSBvZiBwYXJhbXMgaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIGVtcHR5IHN0cmluZw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBjcmVhdGVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uUU5hbWUsIElKYXZhRWxlbWVudCBhcHBsaWVkRWxlbWVudCwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzKQ0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShhbm5vdGF0aW9uUU5hbWUsICJhbm5vdGF0aW9uUU5hbWUiKTsJIC8vJE5PTi1OTFMtMSQJDQotCQlpZiAoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQludWxsQ2hlY2tQYXJhbShwYXJhbVZhbHVlUGFpcnMsICJwYXJhbVZhbHVlUGFpcnMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJbnVsbENoZWNrUGFyYW0oYXBwbGllZEVsZW1lbnQsICJhcHBsaWVkRWxlbWVudCIpOyAvLyROT04tTkxTLTEkDQotDQotCQlmaW5hbCBBbm5vdGF0aW9uSW1wbDxJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SUphdmFFbGVtZW50Pihhbm5vdGF0aW9uUU5hbWUsIHBhcmFtVmFsdWVQYWlycyk7DQotCQlhbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoYXBwbGllZEVsZW1lbnQpOw0KLQkJDQotCQlyZXR1cm4gYW5ub3RhdGlvbjsNCi0JfQkNCi0JDQotCS8qKg0KLQkqIENyZWF0ZXMgcGFyYW0tdmFsdWUgcGFpciBuZWVkZWQgaW4gY29tcGxleCBBbm5vdGF0aW9ucy4NCi0JICogDQotCSAqIEBwYXJhbSBwYXJhbQ0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgSVBhcmFtVmFsdWVQYWlyDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cGFyYW08L2NvZGU+IG9yIDxjb2RlPnZhbHVlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5wYXJhbTwvY29kZT4gcGFyYW1ldGVyIGlzIGVtcHR5IFN0cmluZy4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVBhcmFtVmFsdWVQYWlyIGNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoU3RyaW5nIHBhcmFtLCBJVmFsdWUgdmFsdWUpDQotCXsNCi0JCWlmIChwYXJhbSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW0gc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZiAocGFyYW0udHJpbSgpLmxlbmd0aCgpID09IDApDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyYW0gc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmchIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWlmICh2YWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWUgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gbmV3IFBhcmFtVmFsdWVQYWlySW1wbChwYXJhbSwgdmFsdWUpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVZhbHVlfSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCA8Y29kZT52YWx1ZXM8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlcw0KLQkgKiANCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgSVZhbHVlfQ0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnZhbHVlczwvY29kZT4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIGVtcHR5IFNldC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZUFycmF5VmFsdWUoU2V0PElWYWx1ZT4gdmFsdWVzKQ0KLQl7DQotCQlpZiAodmFsdWVzID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ2YWx1ZXMgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZiAodmFsdWVzLnNpemUoKSA8IDEpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidmFsdWVzIHNob3VsZCBub3QgYmUgZW1wdHkgU2V0ISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlcyk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJVmFsdWV9IGluc3RhbmNlIG91dCBvZiA8Y29kZT52YWx1ZTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIElWYWx1ZX0NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZUJvb2xlYW5WYWx1ZShib29sZWFuIHZhbHVlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEJvb2xlYW5WYWx1ZUltcGwodmFsdWUpOw0KLQl9DQotCQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2Ugb3V0IG9mIDxjb2RlPnZhbHVlPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKiANCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nfQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVmFsdWUgY3JlYXRlQ2xhc3NWYWx1ZShTdHJpbmcgdmFsdWUpDQotCXsNCi0JCWlmICh2YWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWUgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZih2YWx1ZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidmFsdWUgc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmciKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbmV3IENsYXNzVmFsdWVJbXBsKHZhbHVlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2Ugb3V0IG9mIDxjb2RlPnZhbHVlPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKiANCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGxpbmsgSVZhbHVlfQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVmFsdWUgY3JlYXRlSW50ZWdlclZhbHVlKFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBJbnRlZ2VyVmFsdWVJbXBsKHZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVZhbHVlfSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBmdWxseSBxdWFsaWZpZWQgbmFtZS4NCi0JICogDQotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lDQotCSAqDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIElWYWx1ZX0NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8dHQ+cXVhbGlmaWVkTmFtZTwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaXMgbm90IGluIGNvcnJlY3QgZm9ybSBlLmcuIGNvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmcsIHNob2xkIGJlIHF1YWxpZmllZC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkNCi0Jew0KLQkJaWYgKHF1YWxpZmllZE5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInF1YWxpZmllZE5hbWUgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZiAocXVhbGlmaWVkTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCB8fCBxdWFsaWZpZWROYW1lLmluZGV4T2YoJy4nKSA9PSAtMSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWFsaWZpZWROYW1lIGlzIG5vdCBpbiBjb3JyZWN0IGZvcm0hIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZVZhbHVlSW1wbChxdWFsaWZpZWROYW1lKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2Ugb3V0IG9mIDxjb2RlPnZhbHVlPC9jb2RlPiBjb250ZW50Lg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIElWYWx1ZX0NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDx0dD52YWx1ZTwvdHQ+IGlzIG51bGwuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWYWx1ZSBjcmVhdGVTdHJpbmdWYWx1ZShTdHJpbmcgdmFsdWUpDQotCXsNCi0JCWlmICh2YWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWUgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gbmV3IFN0cmluZ1ZhbHVlSW1wbCh2YWx1ZSk7DQotCX0NCi0JDQotCQ0KLS8vCS8qKg0KLS8vCSAqIFJldHJpZXZlcyBhbGwgQW5ub3RhdGlvbnMgZnJvbSBjbGFzcy4NCi0vLwkgKiANCi0vLwkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0vLwkgKg0KLS8vCSAqIEByZXR1cm4gY29udGFpbmVkIGFubm90YXRpb25zIGluIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPg0KLS8vCSAqIA0KLS8vCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIGV4Y2VwdGlvbiBvY2N1cnMNCi0vLwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotLy8JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IEl0eXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyDQotLy8JICovDQotLy8JcHVibGljIHN0YXRpYyBTZXQ8SUFubm90YXRpb24+IGdldEFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLS8vCXsNCi0vLwkJaWYgKGphdmFFbGVtZW50ID09IG51bGwpDQotLy8JCXsNCi0vLwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiamF2YUVsZW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsISIpOw0KLS8vCQl9DQotLy8JCWlmKCEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgfHwgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHx8ICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpIHx8ICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikpDQotLy8JCXsNCi0vLwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImphdmFFbGVtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUhIik7DQotLy8JCX0NCi0vLwkJcHBwcHBwDQotLy8JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgYWxsIEFubm90YXRpb25zIGZyb20gPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFFbGVtZW50DQotCSAqDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IEl0eXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJaWYgKGphdmFFbGVtZW50ID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXZhRWxlbWVudCBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKCEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiamF2YUVsZW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcmVtb3ZlQW5ub3RhdGlvbnMoamF2YUVsZW1lbnQsIG51bGwpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlcyBBbm5vdGF0aW9ucyB3aXRoIG5hbWVzIGNvbnRhaW5lZCBpbiA8Y29kZT5hbm5vdGF0aW9uczwvY29kZT4gZnJvbSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gYW5kIGl0cyBjaGlsZHJlbiwgaWYgc3VjaCBleGlzdC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnMNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gb3IgPHR0PmFubm90YXRpb25zPC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IEl0eXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFubm90YXRpb25zKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWlmIChqYXZhRWxlbWVudCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiamF2YUVsZW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImphdmFFbGVtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXRyeSANCi0JCXsNCi0JCQlBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5yZW1vdmVBbm5vdGF0aW9ucyhqYXZhRWxlbWVudCwgYW5ub3RhdGlvbnMsIHRydWUpOw0KLQkJfSANCi0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuSW52YWxpZFRyZWVTdGF0ZU1zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ29tcFVuaXRNaXNzaW5nTXNnLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNhbm5vdFBlcmZvcm1FZGl0TXNnLCBlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZSBpbnN0YW5jZSBvZiBJQW5ub3RhdGlvbkluc3BlY3RvciBmb3IgYSBzcGVjaWZpYyBJVHlwZS4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlIC0gSVR5cGUsIHdoaWNoIHdpbGwgYmUgaW5zcGVjdGVkLg0KLQkgKiAgDQotCSAqIEByZXR1cm4gSUFubm90YXRpb25JbnNwZWN0b3INCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUFubm90YXRpb25JbnNwZWN0b3IgY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihJVHlwZSB0eXBlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEFubm90YXRpb25JbnNwZWN0b3JJbXBsKHR5cGUpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1NThhOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmV4Y2VwdGlvbi5Mb2NhbGl6ZWRFeGNlcHRpb247DQotDQotLyoqDQotICogRXhjZXB0aW9uIHRocm93biBieSBhbm5vdGF0aW9uIGdlbmVyYXRvciBpbiBjYXNlIHdoZW4gdW5leHBlY3RlZCBjb25kaXRpb24gaXMgbWV0DQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24gZXh0ZW5kcyBMb2NhbGl6ZWRFeGNlcHRpb24NCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZ2V0dGluZyBlcnJvciBtZXNzYWdlLCBsb2NhbGl6ZWQgbWVzc2FnZSBhbmQge0BsaW5rIFRocm93YWJsZX0gdG8gYmUgd3JhcHBlZA0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UgDQotCSAqIEBwYXJhbSB0DQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSB0KQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlLCBsb2NhbGl6ZWRNZXNzYWdlLCB0KTsJDQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIHdpdGggZXJyb3IgbWVzc2FnZSBhbmQgYSBsb2NhbGl6ZWQgbWVzc2FnZS4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlDQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpDQotCXsNCi0JCXN1cGVyKG1lc3NhZ2UsIGxvY2FsaXplZE1lc3NhZ2UpOwkJDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25Xcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2YwNzMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmNsYXp6LkFTVFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5FZGl0UmVzb3VyY2VzTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuSUZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0Ow0KLQ0KLS8qKg0KLSAqIENsYXNzLCB3aGljaCBpcyB1c2VkIHRvIHNhdmUgdGhlIGFubm90YXRpb25zLg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Xcml0ZXINCi17DQotCXByaXZhdGUgc3RhdGljIEFubm90YXRpb25Xcml0ZXIgd3JpdGVyID0gbnVsbDsNCi0JcHJpdmF0ZSBmaW5hbCBJRmlsZVV0aWxzIGZpbGVVdGlscyA9IEZpbGVVdGlscy5nZXRJbnN0YW5jZSgpOw0KLQ0KLQkvKioNCi0JICogVGhlIGZhY3RvcnkgbWV0aG9kLg0KLQkgKiANCi0JICogQHJldHVybiBhIEFubm90YXRpb25Xcml0ZXIgaW5zdGFuY2UuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IEFubm90YXRpb25Xcml0ZXIgZ2V0SW5zdGFuY2UoKQ0KLQl7DQotCQlpZiAod3JpdGVyID09IG51bGwpDQotCQl7DQotCQkJd3JpdGVyID0gbmV3IEFubm90YXRpb25Xcml0ZXIoKTsNCi0JCX0NCi0JCXJldHVybiB3cml0ZXI7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBBZGRzIEFubm90YXRpb24gdG8gc3BlY2lmaWMgSUphdmFFbGVtZW50Lg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFFbGVtZW50DQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJVHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlci4NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLg0KLQkgKi8NCi0JcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHNldEFwcGxpZWRFbGVtZW50KGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24sIGZpbmFsIFQgamF2YUVsZW1lbnQpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsID0gKEFubm90YXRpb25JbXBsPFQ+KWFubm90YXRpb247DQotCQlhbm5vdGF0aW9uSW1wbC5zZXRKYXZhRWxlbWVudChqYXZhRWxlbWVudCk7DQotCQkNCi0JCXNldEFubm90YXRhdGlvblN0cmluZ1ZhbGx1ZShhbm5vdGF0aW9uSW1wbCwgdHJ1ZSwgamF2YUVsZW1lbnQpOw0KLQl9DQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHNldEFubm90YXRhdGlvblN0cmluZ1ZhbGx1ZShBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgYm9vbGVhbiBuZWVkU2F2ZSwgZmluYWwgVCBqYXZhRWxlbWVudCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJaWYgKCFuZWVkU2F2ZSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkNCi0JCXsNCi0JCQlhZGRUb0NsYXNzKGFubm90YXRpb25JbXBsLCAoSVR5cGUpamF2YUVsZW1lbnQpOwkJCQkNCi0JCX0NCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKQ0KLQkJew0KLQkJCWFkZFRvRmllbGQoYW5ub3RhdGlvbkltcGwsIChJRmllbGQpamF2YUVsZW1lbnQpOw0KLQkJfQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKQ0KLQkJew0KLQkJCWFkZFRvTWV0aG9kKGFubm90YXRpb25JbXBsLCAoSU1ldGhvZClqYXZhRWxlbWVudCk7DQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKQ0KLQkJew0KLQkJCWFkZFRvUGFyYW0oYW5ub3RhdGlvbkltcGwsIChJVHlwZVBhcmFtZXRlcilqYXZhRWxlbWVudCk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkVG9DbGFzcyhBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSVR5cGUgY2xhc3NUeXBlKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotDQotCQlhZGRUb01lbWJlcihhbm5vdGF0aW9uSW1wbCwgY2xhc3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBjbGFzc1R5cGUsIGNsYXNzTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRUb0ZpZWxkKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBJRmllbGQgZmllbGRUeXBlKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZmllbGRUeXBlLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotDQotCQlhZGRUb01lbWJlcihhbm5vdGF0aW9uSW1wbCwgZmllbGRUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBmaWVsZFR5cGUsIGNsYXNzTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRUb01ldGhvZChBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSU1ldGhvZCBtZXRob2RUeXBlKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gbWV0aG9kVHlwZS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQ0KLQkJYWRkVG9NZW1iZXIoYW5ub3RhdGlvbkltcGwsIG1ldGhvZFR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG1ldGhvZFR5cGUsIGNsYXNzTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRUb1BhcmFtKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW0pIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlNZW1iZXIgbWVtYmVyID0gdHlwZVBhcmFtLmdldERlY2xhcmluZ01lbWJlcigpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7DQotCQlpZiAobWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkNCi0JCXsNCi0JCQljbGFzc05hbWUgPSBtZW1iZXIuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEVsZW1lbnROYW1lKCk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQljbGFzc05hbWUgPSBtZW1iZXIuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCX0NCi0NCi0JCWFkZFRvTWVtYmVyKGFubm90YXRpb25JbXBsLCBtZW1iZXIuZ2V0Q29tcGlsYXRpb25Vbml0KCksIHR5cGVQYXJhbSwgY2xhc3NOYW1lKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIGFkZFRvTWVtYmVyKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBJQ29tcGlsYXRpb25Vbml0IGNVbml0LCBJSmF2YUVsZW1lbnQgdHlwZSwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJaWYgKGNVbml0ID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQ0KLQkJCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoY1VuaXQsIG51bGwpOw0KLQkJCUFTVCBhc3QgPSB1bml0LmdldEFTVCgpOw0KLQ0KLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKUFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgdW5pdCk7DQotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJc3dpdGNoICh0eXBlLmdldEVsZW1lbnRUeXBlKCkpDQotCQkJCXsNCi0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToNCi0JCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbkltcGwsIGNVbml0LCB1bml0LCBhc3QsIHR5cGVEZWNsYXJhdGlvbik7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOg0KLQkJCQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKChJTWV0aG9kKSB0eXBlLCB0eXBlRGVjbGFyYXRpb24pOw0KLQkJCQkJYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uSW1wbCwgY1VuaXQsIHVuaXQsIGFzdCwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEOg0KLQkJCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWVsZERlY2xhcmF0aW9uKChJRmllbGQpIHR5cGUsIHR5cGVEZWNsYXJhdGlvbik7DQotCQkJCQlhZGRBbm5vdGF0aW9uKGFubm90YXRpb25JbXBsLCBjVW5pdCwgdW5pdCwgYXN0LCBmaWVsZERlY2xhcmF0aW9uKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFX1BBUkFNRVRFUjoNCi0JCQkJCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSAoSVR5cGVQYXJhbWV0ZXIpIHR5cGU7DQotCQkJCQlpZiAodHlwZVBhcmFtZXRlci5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpDQotCQkJCQl7DQotCQkJCQkJbWV0aG9kRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKChJTWV0aG9kKSB0eXBlUGFyYW1ldGVyLmdldERlY2xhcmluZ01lbWJlcigpLCB0eXBlRGVjbGFyYXRpb24pOw0KLQkJCQkJCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1EZWNsYXJhdGlvbiA9IGdldFBhcmFtRGVjbGFyYXRpb24odHlwZVBhcmFtZXRlciwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLQkJCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbkltcGwsIGNVbml0LCB1bml0LCBhc3QsIHBhcmFtRGVjbGFyYXRpb24pOw0KLQkJCQkJfQ0KLQkJCQkJYnJlYWs7DQotCQkJCWRlZmF1bHQ6DQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCB0eXBlIGZvciBhbm5vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkludmFsaWRUcmVlU3RhdGVNc2csIGUpOw0KLQkJfQ0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNhbm5vdFBlcmZvcm1FZGl0TXNnLCBlKTsNCi0JCX0NCi0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ29tcFVuaXRNaXNzaW5nTXNnLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRBbm5vdGF0aW9uKEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsLCBJQ29tcGlsYXRpb25Vbml0IGNVbml0LCBDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCwgQVNUTm9kZSBkZWNsYXJhdGlvbikgDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQllZGl0UmVzTWFuYWdlcigpLnNldEZpbGVFZGl0YWJsZSgoSUZpbGUpIGNVbml0LmdldFJlc291cmNlKCkpOw0KLQ0KLQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlFeHByZXNzaW9uIGFubm90ID0gYW5ub3RhdGlvbkltcGwuZ2V0RXhwcmVzc2lvbih1bml0LCBhc3QpOw0KLQ0KLQkJTGlzdCBtb2RpZmllcnMgPSBudWxsOw0KLQ0KLQkJc3dpdGNoIChkZWNsYXJhdGlvbi5nZXROb2RlVHlwZSgpKQ0KLQkJew0KLQkJY2FzZSBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTjoNCi0JCWNhc2UgQVNUTm9kZS5GSUVMRF9ERUNMQVJBVElPTjoNCi0JCWNhc2UgQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OOg0KLQkJCW1vZGlmaWVycyA9ICgoQm9keURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbikubW9kaWZpZXJzKCk7DQotCQkJYnJlYWs7DQotCQljYXNlIEFTVE5vZGUuU0lOR0xFX1ZBUklBQkxFX0RFQ0xBUkFUSU9OOg0KLQkJCW1vZGlmaWVycyA9ICgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pLm1vZGlmaWVycygpOw0KLQkJCWJyZWFrOw0KLQkJZGVmYXVsdDoNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhZGRBbm5vdGF0aW9uKCkgaWxsZWdhbCBkZWNsYXRhaW9uIHR5cGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJbW9kaWZpZXJzLmFkZCgwLCBhbm5vdCk7DQotDQotCQlJRG9jdW1lbnQgZG9jID0gQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RG9jdW1lbnQoY1VuaXQpOw0KLQ0KLQkJVGV4dEVkaXQgZWRpdCA9IHVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJSVN0YXR1cyBzdGF0dXMgPSBlZGl0UmVzTWFuYWdlcigpLnNldEZpbGVFZGl0YWJsZSgoSUZpbGUpIGNVbml0LmdldFJlc291cmNlKCkpOw0KLQkJaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSykNCi0JCXsNCi0JCQlmaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoY1VuaXQsIGRvYy5nZXQoKSwgdHJ1ZSwgbnVsbCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oIkFubm90YXR0aW9uIGNvdWxkIG5vdCBiZSBzdG9yZWQsIHRoZSBmaWxlIGlzIG5vdCB3cml0YWJsZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCUpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25DYW5ub3RCZVN0b3JlZE1zZyk7IA0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0UGFyYW1EZWNsYXJhdGlvbihJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikNCi0Jew0KLQkJLy9UT0RPIGNoZWNrIHRoaXMgbWV0aG9kDQotCQlmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gdHlwZVBhcmFtZXRlci5nZXRFbGVtZW50TmFtZSgpOw0KLQ0KLQkJZm9yIChPYmplY3QgZGVjbCA6IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlpZiAoIShkZWNsIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikpDQotCQkJew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotDQotCQkJaWYgKHBhcmFtTmFtZS5lcXVhbHMoKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBkZWNsKS5nZXROYW1lKCkudG9TdHJpbmcoKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGRlY2w7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBVcGRhdGVzIHRoZSBQYXJhbWV0ZXItVmFsdWUgUGFpcnMgb2Ygc3BlY2lmaWMgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uIC0gQW5ub3RhdGlvbiwgd2hpY2ggd2lsbCBiZSB1cGRhdGVkLg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0dGlvbkltcGwgPSBuZXcgQW5ub3RhdGlvbkltcGw8VD4oYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpKTsNCi0JCXRyeQ0KLQkJew0KLQkJCXVwZGF0ZVRoZUFubm90YXRpb24oYW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLCBhbm5vdGF0dGlvbkltcGwpOw0KLQkJfSANCi0JCWNhdGNoKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5JbnZhbGlkVHJlZVN0YXRlTXNnLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5DYW5ub3RQZXJmb3JtRWRpdE1zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNvbXBVbml0TWlzc2luZ01zZywgZSk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBVcGRhdGVzIHRoZSBQYXJhbS1WYWx1ZSBQYWlycyBvZiBzcGVjaWZpYyBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb24gLSBBbm5vdGF0aW9uLCB3aGljaCB3aWxsIGJlIHVwZGF0ZWQuDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlUGFpcnMgd2hpY2ggd2lsbCBiZSB1cGRhdGVkLiBPbGQgcGFpcnMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBuZXcgb25jZS4NCi0JICogQHBhcmFtIHJlcGxhY2VQcmV2aW91c1BhaXJzIGJvb2xlYW4gdmFsdWUgd2hpY2ggc3BlY2lmaWVzIHRoZSB3YXksIGhvdyBuZXcgSVBhcmFtVmFsdWVQYWlycyB3aWxsIGJlIHVwZGF0ZWQuIElmIHRoZSB2YWx1ZSBpcyA8dHQ+dHJ1ZTwvdHQ+LA0KLQkgKiB0aGUgU2V0IHdpdGggdGhlIG9sZCBJUGFyYW1WYWx1ZVBhaXJzIHdpbGwgYmUgY2xlYXJlZCBhbmQgdGhlIG5ldyB2YWx1ZXMgd2lsbCBiZSBhcHBsaWVkLiBJZiB0aGUgdmFsdWUgaXMgPHR0PmZhbHNlPC90dD4gdGhlIG9sZCBwYWlycyB3aWxsIGJlIGtlcHQNCi0JICogYW5kIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSAgdmFsdWVzIGZyb20gdGhlIG5ldyBTZXQsIGlmIHRoZXJlIGFyZSBwYXJhbXMgd2hpY2ggZG8gbm90IGV4aXN0IGluIHRoZSBvbGQgb25lLCB0aGV5IHdpbGwgYmUgYWRkZWQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKiANCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uKSBpbnN0ZWFkLg0KLQkgKi8NCi0JQERlcHJlY2F0ZWQNCi0JcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMsIGJvb2xlYW4gcmVwbGFjZVByZXZpb3VzUGFpcnMpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsJDQotCQl1cGRhdGVBbm5vdGF0aW9uKGFubm90YXRpb24sIGFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSwgcGFyYW1WYWx1ZVBhaXJzLCByZXBsYWNlUHJldmlvdXNQYWlycyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKiBAcGFyYW0gPFQ+DQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLQkgKiBAcGFyYW0gcGFyYW1WYWx1ZVBhaXJzDQotCSAqIEBwYXJhbSByZXBsYWNlUHJldmlvdXNQYWlycw0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCB1cGRhdGVBbm5vdGF0aW9uKGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24sIGZpbmFsIFQgamF2YUVsZW1lbnQsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycywgYm9vbGVhbiByZXBsYWNlUHJldmlvdXNQYWlycykgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwgPSAoQW5ub3RhdGlvbkltcGw8VD4pYW5ub3RhdGlvbjsNCi0JCXRyeQ0KLQkJew0KLQkJCWlmKHJlcGxhY2VQcmV2aW91c1BhaXJzKQ0KLQkJCXsNCi0JCQkJYW5ub3RhdGlvbkltcGwuc2V0UGFyYW1WYWx1ZVBhaXJzKHBhcmFtVmFsdWVQYWlycyk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhaXIgOiBwYXJhbVZhbHVlUGFpcnMpDQotCQkJCXsNCi0JCQkJCWJvb2xlYW4gaXNVcGRhdGVkID0gZmFsc2U7DQotCQkJCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiB0bXBQYXJhbVZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uSW1wbC5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCQkJCWZvciAoSVBhcmFtVmFsdWVQYWlyIHRoaXNQYWlyIDogdG1wUGFyYW1WYWx1ZVBhaXJzKQ0KLQkJCQkJew0KLQkJCQkJCWlmKHRoaXNQYWlyLmdldFBhcmFtKCkuZXF1YWxzKHBhaXIuZ2V0UGFyYW0oKSkpDQotCQkJCQkJew0KLQkJCQkJCQl0bXBQYXJhbVZhbHVlUGFpcnMucmVtb3ZlKHRoaXNQYWlyKTsNCi0JCQkJCQkJdG1wUGFyYW1WYWx1ZVBhaXJzLmFkZChwYWlyKTsNCi0JCQkJCQkJaXNVcGRhdGVkID0gdHJ1ZTsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJaWYoIWlzVXBkYXRlZCkNCi0JCQkJCXsNCi0JCQkJCQl0bXBQYXJhbVZhbHVlUGFpcnMuYWRkKHBhaXIpOw0KLQkJCQkJfQ0KLQkJCQkJYW5ub3RhdGlvbkltcGwuc2V0UGFyYW1WYWx1ZVBhaXJzKHRtcFBhcmFtVmFsdWVQYWlycyk7DQotCQkJCX0NCi0JCQl9DQotCQkJdXBkYXRlVGhlQW5ub3RhdGlvbihqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkltcGwpOw0KLQkJCQ0KLQkJCS8vcmVtb3ZlKGFubm90YXRpb24pOw0KLQkJCS8vc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgamF2YUVsZW1lbnQpOw0KLQkJfSANCi0JCWNhdGNoKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5JbnZhbGlkVHJlZVN0YXRlTXNnLCBlKTsNCi0JCX0gDQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5DYW5ub3RQZXJmb3JtRWRpdE1zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNvbXBVbml0TWlzc2luZ01zZywgZSk7DQotCQl9DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uIC0gQW5ub3RhdGlvbiwgd2hpY2ggd2lsbCBiZSByZW1vdmVkLg0KLQkgKiANCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHJlbW92ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlyZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb24sIGFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCByZW1vdmVBbm5vdGF0aW9uKGZpbmFsIElBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24sIGZpbmFsIFQgamF2YUVsZW1lbnQpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsID0gKEFubm90YXRpb25JbXBsPFQ+KWFubm90YXRpb247DQotCQl0cnkNCi0JCXsNCi0vLwkJCWlmKGFubm90YXRpb25JbXBsLmdldEFubm90YXRpb25TdHJpbmdWYWx1ZSgpID09IG51bGwgfHwgYW5ub3RhdGlvbkltcGwuZ2V0QW5ub3RhdGlvblN0cmluZ1ZhbHVlKCkudHJpbSgpLmVxdWFscygiIikpDQotLy8JCQl7DQotLy8JCQkJYW5ub3RhdGlvbkltcGwuc2V0QW5ub3RhdGlvblN0cmluZ1ZhbHVlKGNyZWF0ZUFubm90YXRhdGlvblN0cmluZ1ZhbGx1ZShhbm5vdGF0aW9uSW1wbCwgamF2YUVsZW1lbnQpKTsNCi0vLwkJCQlBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5yZW1vdmVBbm5vdGF0aW9uKGphdmFFbGVtZW50LCBhbm5vdGF0aW9uSW1wbC5nZXRBbm5vdGF0aW9uU3RyaW5nVmFsdWUoKSk7DQotLy8JCQl9DQotLy8JCQllbHNlDQotLy8JCQl7DQotCQkJCUFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLnJlbW92ZUFubm90YXRpb24oamF2YUVsZW1lbnQsIGFubm90YXRpb25JbXBsLmdldFNpbXBsZUFubm90YXRpb25OYW1lKCkpOw0KLS8vCQkJfQ0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGJsZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNhbm5vdFBlcmZvcm1FZGl0TXNnLCBibGUpOw0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZm5mZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNvbXBVbml0TWlzc2luZ01zZywgZm5mZSk7DQotCQl9CQ0KLQl9DQotDQotCS8vIGkwMzY1MDkgYWRkZWQNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgdXBkYXRlVGhlQW5ub3RhdGlvbihmaW5hbCBUIGphdmFFbGVtZW50LCBmaW5hbCBBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JewkJDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGlDdSA9IGdldEN1KGphdmFFbGVtZW50KTsNCi0JCWZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoaUN1LCBudWxsKTsNCi0JCQ0KLQkJQm9keURlY2xhcmF0aW9uIGJkID0gbnVsbDsNCi0JCUFubm90YXRpb24gZm91bmQgPSBudWxsOw0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkNCi0JCXsNCi0JCQliZCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGphdmFFbGVtZW50LmdldEVsZW1lbnROYW1lKCksIHVuaXQpOw0KLQkJCWZvdW5kID0gZmluZEFubm90YXRpb24oYmQsIGFubm90YXRpb25JbXBsKTsNCi0NCi0JCQl1bml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCQlpZiAoZm91bmQhPW51bGwpIHsNCi0JCQkJYmQubW9kaWZpZXJzKCkucmVtb3ZlKGZvdW5kKTsNCi0JCQl9DQotCQkJDQotCQkJZmluYWwgRXhwcmVzc2lvbiBhbm5vdCA9IGFubm90YXRpb25JbXBsLmdldEV4cHJlc3Npb24odW5pdCwgdW5pdC5nZXRBU1QoKSk7DQotCQkJYmQubW9kaWZpZXJzKCkuYWRkKDAsIGFubm90KTsNCi0JCX0NCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkNCi0JCXsNCi0JCQlUeXBlRGVjbGFyYXRpb24gdGQgPSAoVHlwZURlY2xhcmF0aW9uKUFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCgoSU1ldGhvZClqYXZhRWxlbWVudCkuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEVsZW1lbnROYW1lKCksIHVuaXQpOw0KLQkJCWJkID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbigoKElNZXRob2QpamF2YUVsZW1lbnQpLCB0ZCk7DQotCQkJZm91bmQgPSBmaW5kQW5ub3RhdGlvbihiZCwgYW5ub3RhdGlvbkltcGwpOw0KLQkJDQotCQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQkJaWYgKGZvdW5kIT1udWxsKSB7DQotCQkJCWJkLm1vZGlmaWVycygpLnJlbW92ZShmb3VuZCk7DQotCQkJfQ0KLQkJCQ0KLQkJCWZpbmFsIEV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIHVuaXQuZ2V0QVNUKCkpOw0KLQkJCWJkLm1vZGlmaWVycygpLmFkZCgwLCBhbm5vdCk7DQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkNCi0JCXsNCi0JCQlUeXBlRGVjbGFyYXRpb24gdGQgPSAoVHlwZURlY2xhcmF0aW9uKUFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCgoSUZpZWxkKWphdmFFbGVtZW50KS5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0RWxlbWVudE5hbWUoKSwgdW5pdCk7DQotCQkJYmQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oKChJRmllbGQpamF2YUVsZW1lbnQpLCB0ZCk7DQotCQkJZm91bmQgPSBmaW5kQW5ub3RhdGlvbihiZCwgYW5ub3RhdGlvbkltcGwpOw0KLQkJDQotCQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQkJaWYgKGZvdW5kIT1udWxsKSB7DQotCQkJCWJkLm1vZGlmaWVycygpLnJlbW92ZShmb3VuZCk7DQotCQkJfQ0KLQkJCQ0KLQkJCWZpbmFsIEV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIHVuaXQuZ2V0QVNUKCkpOw0KLQkJCWJkLm1vZGlmaWVycygpLmFkZCgwLCBhbm5vdCk7DQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKQ0KLQkJew0KLQkJCWlmKCgoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpLmdldERlY2xhcmluZ01lbWJlcigpIGluc3RhbmNlb2YgSVR5cGUpDQotCQkJew0KLQkJCQliZCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCgoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpLmdldERlY2xhcmluZ01lbWJlcigpLmdldEVsZW1lbnROYW1lKCksIHVuaXQpOw0KLQkJCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtID0gZmluZFBhcmFtZXRlcihiZCwgamF2YUVsZW1lbnQpOw0KLQkJCQlpZihwYXJhbSAhPSBudWxsKQ0KLQkJCQl7DQotCQkJCQlmb3VuZCA9IGZpbmRQYXJhbUFubm90YXRpb24ocGFyYW0sIGFubm90YXRpb25JbXBsLCBqYXZhRWxlbWVudCk7DQotCQkJCX0NCi0NCi0JCQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQkJCWlmIChmb3VuZCE9bnVsbCkgew0KLQkJCQkJcGFyYW0ubW9kaWZpZXJzKCkucmVtb3ZlKGZvdW5kKTsNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJZmluYWwgRXhwcmVzc2lvbiBhbm5vdCA9IGFubm90YXRpb25JbXBsLmdldEV4cHJlc3Npb24odW5pdCwgdW5pdC5nZXRBU1QoKSk7DQotCQkJCXBhcmFtLm1vZGlmaWVycygpLmFkZCgwLCBhbm5vdCk7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IChUeXBlRGVjbGFyYXRpb24pQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oKChJTWV0aG9kKSgoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpLmdldFBhcmVudCgpKS5nZXREZWNsYXJpbmdUeXBlKCkuIGdldEVsZW1lbnROYW1lKCksIHVuaXQpOw0KLQkJCQliZCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKChJTWV0aG9kKSgoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpLmdldFBhcmVudCgpKSwgdGQpOw0KLQkJCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtID0gZmluZFBhcmFtZXRlcihiZCwgamF2YUVsZW1lbnQpOw0KLQkJCQlpZihwYXJhbSAhPSBudWxsKQ0KLQkJCQl7DQotCQkJCQlmb3VuZCA9IGZpbmRQYXJhbUFubm90YXRpb24ocGFyYW0sIGFubm90YXRpb25JbXBsLCBqYXZhRWxlbWVudCk7DQotCQkJCX0NCi0NCi0JCQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQkJCWlmIChmb3VuZCE9bnVsbCkgew0KLQkJCQkJcGFyYW0ubW9kaWZpZXJzKCkucmVtb3ZlKGZvdW5kKTsNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJZmluYWwgRXhwcmVzc2lvbiBhbm5vdCA9IGFubm90YXRpb25JbXBsLmdldEV4cHJlc3Npb24odW5pdCwgdW5pdC5nZXRBU1QoKSk7DQotCQkJCXBhcmFtLm1vZGlmaWVycygpLmFkZCgwLCBhbm5vdCk7DQotCQkJfQ0KLQkJfQ0KLQkJCQkNCi0JCXNldEFubm90YXRhdGlvblN0cmluZ1ZhbGx1ZShhbm5vdGF0aW9uSW1wbCwgZmFsc2UsIGphdmFFbGVtZW50KTsNCi0JCWZpbmFsIElEb2N1bWVudCBkb2MgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXREb2N1bWVudChpQ3UpOwkNCi0JCWZpbmFsIFRleHRFZGl0IGVkaXQgPSB1bml0LnJld3JpdGUoZG9jLCBqYXZhRWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbnModHJ1ZSkpOw0KLQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJSVN0YXR1cyBzdGF0dXMgPSBlZGl0UmVzTWFuYWdlcigpLnNldEZpbGVFZGl0YWJsZSgoSUZpbGUpIGlDdS5nZXRSZXNvdXJjZSgpKTsNCi0JCWlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spDQotCQl7DQotCQkJZmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKGlDdSwgZG9jLmdldCgpLCB0cnVlLCBudWxsKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbigiQW5ub3RhdHRpb24gY291bGQgbm90IGJlIHN0b3JlZCwgdGhlIGZpbGUgaXMgbm90IHdyaXRhYmxlIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJSmF4V3NVdGlsTWVzc2FnZXMuQW5ub3RhdGlvbkNhbm5vdEJlU3RvcmVkTXNnKTsgDQotCQl9DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIEFubm90YXRpb24gZmluZEFubm90YXRpb24oZmluYWwgQm9keURlY2xhcmF0aW9uIHRkLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKQ0KLQl7DQotCQlBbm5vdGF0aW9uIGFubjsNCi0JCWZvciAoSUV4dGVuZGVkTW9kaWZpZXIgbW9kaWZpZXIgOiAoTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4pdGQubW9kaWZpZXJzKCkpIA0KLQkJew0KLQkJCWlmKCFtb2RpZmllci5pc0Fubm90YXRpb24oKSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJYW5uID0gKEFubm90YXRpb24pbW9kaWZpZXI7DQotCQkJaWYgKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lbmRzV2l0aChhbm4uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIHsNCi0JCQkJcmV0dXJuIGFubjsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGZpbmRQYXJhbWV0ZXIoZmluYWwgQm9keURlY2xhcmF0aW9uIHRkLCBUIGphdmFFbGVtZW50KQ0KLQl7DQotCQlpZiAodGQgIT0gbnVsbCkNCi0JCXsNCi0JCQlmb3IgKE9iamVjdCBwYXJhbSA6ICgoTWV0aG9kRGVjbGFyYXRpb24pdGQpLnBhcmFtZXRlcnMoKSkNCi0JCQl7DQotCQkJCWlmIChwYXJhbSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gJiYNCi0JCQkJCQkoKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KS5nZXRFbGVtZW50TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbilwYXJhbSkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pcGFyYW07DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IEFubm90YXRpb24gZmluZFBhcmFtQW5ub3RhdGlvbihmaW5hbCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uLCBUIGphdmFFbGVtZW50KQ0KLQl7DQotCQlBbm5vdGF0aW9uIGFubjsNCi0JCWZvciAoSUV4dGVuZGVkTW9kaWZpZXIgbW9kaWZpZXIgOiAoTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4pKHBhcmFtLm1vZGlmaWVycygpKSkgDQotCQl7DQotCQkJaWYoIW1vZGlmaWVyLmlzQW5ub3RhdGlvbigpKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlhbm4gPSAoQW5ub3RhdGlvbiltb2RpZmllcjsNCi0JCQlpZiAoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVuZHNXaXRoKGFubi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgew0KLQkJCQlyZXR1cm4gYW5uOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgZ2V0Q3UoZmluYWwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50KQ0KLQl7DQotCQlzd2l0Y2ggKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIA0KLQkJew0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToNCi0JCQlyZXR1cm4gKChJVHlwZSkgamF2YUVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6DQotCQkJcmV0dXJuICgoSUZpZWxkKSBqYXZhRWxlbWVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6DQotCQkJcmV0dXJuICgoSU1ldGhvZCkgamF2YUVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVI6DQotCQkJcmV0dXJuICgoSVR5cGVQYXJhbWV0ZXIpIGphdmFFbGVtZW50KS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByaXZhdGUgRWRpdFJlc291cmNlc01hbmFnZXIgZWRpdFJlc01hbmFnZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEVkaXRSZXNvdXJjZXNNYW5hZ2VyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZDhkODM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotDQotLyoqDQotICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBDb21wbGV4IEFubm90YXRpb24gY29uc2lzdGluZyBvZiBwYXJhbS12YWx1ZSBwYWlycy4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+DQotew0KLQkvKioNCi0JICogUmV0dXJuIHRoZSBwYXJhbS12YWx1ZSBwYWlycyB3aGljaCB0aGlzIEFubm90YXRpb24gaGFzLg0KLQkgKiANCi0JICogQHJldHVybiBTZXQgb2YgcGFyYW0tdmFsdWVzIHBhaXJzLg0KLQkgKi8NCi0JcHVibGljIFNldDxJUGFyYW1WYWx1ZVBhaXI+IGdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgd2l0aCBuYW1lIHBhcmFtLiANCi0JICogQHBhcmFtIHBhcmFtIC0gdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB3aG8ncyB2YWx1ZSBpcyByZXF1ZXN0ZWQNCi0JICogQHJldHVybiAtIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4gTnVsbCBpZiBzdWNoIHBhcmFtZXRlciBjYW5ub3QgYmUgZm91bmQgb3IgaGFzIGEgdmFsdWUgb2YgbnVsbC4NCi0JICogQHRocm93cyAtIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHBhcmFtIGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcGFyYW0pOw0KLQkJDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBULCB0byB3aGljaCB0aGlzIGFubm90YXR0aW9uIGlzIGFzc29jaWF0ZWQuDQotCSAqLw0KLSAgICBwdWJsaWMgVCBnZXRBcHBsaWVkRWxlbWVudCgpOw0KLSAgICAgICAgDQotICAgIA0KLS8vRnJvbSBJQW5ub3RhdHRpb25CYXNlICAgIA0KLQkvKioNCi0JICogQHJldHVybiAtIGFubm90YXRpb24gbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOw0KLQkNCi0JLyoqDQotCSAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4NCi0JICogDQotCSAqIEByZXR1cm4gSUxvY2F0b3INCi0JICovDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCk7DQotCQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uQmFzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmY5MDBkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247DQotDQotLyoqDQotICogQmFzZSBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIEFubm90YXRpb24gYW5kIHRoZSBmdW5jdGlvbmFsaXR5LCByZXF1aXJlZCBieSBpdC4NCi0gKg0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25CYXNlPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+DQotew0KLQkvKiogc2ltcGxlIGFubm90YXRpb24gdHlwZSBJRCAqLw0KLQlwdWJsaWMgZmluYWwgaW50IFNJTVBMRV9BTk5PVEFUSU9OID0gMTsNCi0NCi0JLyoqIHNpbmdsZSBlbGVtZW50IGFubm90YXRpb24gdHlwZSBJRCAqLw0KLQlwdWJsaWMgZmluYWwgaW50IFNJTkdMRV9FTEVNRU5UX0FOTk9UQVRJT04gPSAyOw0KLQ0KLQkvKiogY29tcGxleCBhbm5vdGF0aW9uIHR5cGUgSUQgKi8NCi0JcHVibGljIGZpbmFsIGludCBDT01QTEVYX0FOTk9UQVRJT04gPSA0Ow0KLQ0KLQkvKioNCi0JICogQHJldHVybiAtIGFubm90YXRpb24gbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOw0KLQ0KLQkvKioNCi0JICogR2V0dGluZyB0aGUgVHlwZUlEIG9mIGN1cnJlbnQgQW5ub3RhdGlvbg0KLQkgKiANCi0JICogQHJldHVybiBJbnRlZ2VyIHZhbHVlLCB3aGljaCByZXByZXNlbnRzIHRoZSBBbm5vdGF0aW9uIFR5cGVJRA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRUeXBlKCk7DQotCQ0KLQkvKioNCi0JICogQWRkcyBjdXJyZW50IEFubm90YXRpb24gdG8gc3BlY2lmaWMgSUphdmFFbGVtZW50LiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSBJTWVtYmVyIGFzIHBhcmFtZXRlciBiZWNhdXNlIHRoZXJlIGlzIElUeXBlUGFyYW1ldGVyIGFzIHBhcmFtZXRlciB3aGVuIGFkZCB0byBUeXBQYXJhbWV0ZXIgaXMgZXhlY3V0ZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IElUeXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyLg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWVkRWxlbWVudChUIGphdmFFbGVtZW50KSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi0JDQotCS8qKg0KLQkgKiBSZW1vdmUgdGhlIGN1cnJlbnQgQW5ub3RhdGlvbiBmcm9tIHRoZSBhc3NvY2lhdGVkIEphdmFFbGVtZW50Lg0KLQkgKiANCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi0JDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBsb2NhdGlvbiBpbiB0aGUgc291cmNlIGNvZGUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIElMb2NhdG9yDQotCSAqLw0KLQlwdWJsaWMgSUxvY2F0b3IgZ2V0TG9jYXRvcigpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uSW5zcGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uSW5zcGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzZjA1ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkluc3BlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uSW5zcGVjdG9yDQotew0KLQkvKioNCi0JICogUmV0cmlldmVzIGFsbCBUeXBlIGxldmVsIEFubm90YXRpb25zIGZyb20gPGNvZGU+dHlwZTwvY29kZT4sIHdoaWNoIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIElBbm5vdGF0aW9uSW5zcGVjdG9yLg0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgVHlwZSBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT50eXBlPC9jb2RlPiBvciBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vdCBwcmVzZW50Lg0KLQkgKg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGluc3BlY3RUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyBhIFR5cGUgbGV2ZWwgQW5ub3RhdGlvbiB3aXRoIHNwZWNpZmljIFFOYW1lIGZyb20gPGNvZGU+dHlwZTwvY29kZT4sIHdoaWNoIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIElBbm5vdGF0aW9uSW5zcGVjdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZSAtIHNwZWNpZmllZCBRTmFtZSBmb3IgdGhlIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcmV0dXJuIFR5cGUgbGV2ZWwgQW5ub3RhdGlvbiBpbiA8Y29kZT50eXBlPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiwgaWYgc3VjaCBBbm5vdGF0aW9uIGRvIG5vdCBwcmVzZW50Lg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIGVtcHR5IFN0cmluZy4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCUlBbm5vdGF0aW9uPElUeXBlPiBpbnNwZWN0VHlwZShmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIGFsbCBNZXRob2QgbGV2ZWwgQW5ub3RhdGlvbnMgZnJvbSA8Y29kZT5tZXRob2Q8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIG1ldGhvZA0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgTWV0aG9kIGxldmVsIEFubm90YXRpb25zIGluIDxjb2RlPm1ldGhvZDwvY29kZT4gb3IgZW1wdHkgQ29sbGVjdGlvbiBpZiBub3QgcHJlc2VudC4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0Pm1ldGhvZDwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLSAgIENvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGluc3BlY3RNZXRob2QoSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBNZXRob2QgbGV2ZWwgQW5ub3RhdGlvbiB3aXRoIHNwZWNpZmljIFFOYW1lIGZyb20gPGNvZGU+bWV0aG9kPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXRob2QNCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZSAtIHNwZWNpZmllZCBRTmFtZSBmb3IgdGhlIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBNZXRob2QgbGV2ZWwgQW5ub3RhdGlvbiBpbiA8Y29kZT5tZXRob2Q8L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+bWV0aG9kPC90dD4gb3IgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBhcmUgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gaXMgZW1wdHkgU3RyaW5nLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0gIElBbm5vdGF0aW9uPElNZXRob2Q+IGluc3BlY3RNZXRob2QoSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotICAgIC8qKg0KLQkgKiBSZXRyaWV2ZXMgYWxsIEZpZWxkIGxldmVsIEFubm90YXRpb25zIGZyb20gPGNvZGU+ZmllbGQ8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIGZpZWxkDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBGaWxlZCBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT5maWVsZDwvY29kZT4gb3IgZW1wdHkgQ29sbGVjdGlvbiBpZiBub3QgcHJlc2VudC4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+ZmllbGQ8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0gIENvbGxlY3Rpb248SUFubm90YXRpb248SUZpZWxkPj4gaW5zcGVjdEZpZWxkKElGaWVsZCBmaWVsZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0gICANCi0gICAgLyoqDQotCSAqIFJldHJpZXZlcyBhIEZpZWxkIGxldmVsIEFubm90YXRpb24gd2l0aCBzcGVjaWZpYyBRTmFtZSBmcm9tIDxjb2RlPmZpZWxkPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBmaWVsZA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvblFOYW1lIC0gc3BlY2lmaWVkIFFOYW1lIGZvciB0aGUgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIEZpbGVkIGxldmVsIEFubm90YXRpb25zIGluIDxjb2RlPmZpZWxkPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+ZmllbGQ8L2NvZGU+IG9yIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gYXJlIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIGVtcHR5IFN0cmluZy4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICBJQW5ub3RhdGlvbjxJRmllbGQ+IGluc3BlY3RGaWVsZChJRmllbGQgZmllbGQsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotICAgIC8qKg0KLQkgKiBSZXRyaWV2ZXMgYWxsIFR5cGVQYXJhbWV0ZXIgbGV2ZWwgQW5ub3RhdGlvbnMgZnJvbSA8Y29kZT5wYXJhbTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIFR5cGVQYXJhbWV0ZXIgbGV2ZWwgQW5ub3RhdGlvbnMgaW4gPGNvZGU+cGFyYW08L2NvZGU+IG9yIGVtcHR5IENvbGxlY3Rpb24gaWYgbm90IHByZXNlbnQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnBhcmFtPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gaW5zcGVjdFBhcmFtKElUeXBlUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLSAgIA0KLSAgICAvKioNCi0JICogUmV0cmlldmVzIGEgVHlwZVBhcmFtZXRlciBsZXZlbCBBbm5vdGF0aW9uIHdpdGggc3BlY2lmaWMgUU5hbWUgZnJvbSA8Y29kZT5wYXJhbTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZSAtIHNwZWNpZmllZCBRTmFtZSBmb3IgdGhlIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBUeXBlUGFyYW1ldGVyIGxldmVsIEFubm90YXRpb25zIGluIDxjb2RlPnBhcmFtPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+cGFyYW08L2NvZGU+IG9yIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gYXJlIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIGVtcHR5IFN0cmluZy4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gaW5zcGVjdFBhcmFtKElUeXBlUGFyYW1ldGVyIHBhcmFtLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLSAgIA0KLSAgIA0KLSAgIA0KLQkNCi0vLwkvKioNCi0vLwkgKiBSZXRyaWV2ZXMgYWxsIGFubm90YXRpb25zIGZyb20gPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+Lg0KLS8vCSAqIA0KLS8vCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLS8vCSAqIA0KLS8vCSAqIEByZXR1cm4gY29udGFpbmVkIGFubm90YXRpb25zIGluIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBvciBlbXB0eSBDb2xsZWFjdGlvbiBpZiBub3QgcHJlc2VudC4NCi0vLwkgKiANCi0vLwkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotLy8JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IEl0eXBlLCBJTWV0aG9kLCBJRmllbGQuDQotLy8JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0vLwkgKi8NCi0vLwlwdWJsaWMgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbj4gaW5zcGVjdChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiOTBiY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQXR0cmlidXRlVHlwZUVudW07DQotDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvblByb3BlcnR5DQotew0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpOw0KLQkNCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOw0KLQkNCi0JcHVibGljIEF0dHJpYnV0ZVR5cGVFbnVtIGdldEF0dHJpYnV0ZVR5cGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2NjNzY5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uUHJvcGVydHk7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBhbm5vdGF0aW9ucyBjb250YWluZXIuDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXINCi17DQotCXB1YmxpYyB2b2lkIGFkZEFubm90YXRpb25Qcm9wZXJ0eShmaW5hbCBBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5LCBmaW5hbCBFbGVtZW50VHlwZSB0YXJnZXQpOw0KLQkNCi0JcHVibGljIFNldDxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IGdldFBhcmFtZXRlckFubm90YXRpb25zKElUeXBlUGFyYW1ldGVyIHRQYXJhbSk7DQotDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SVR5cGU+PiBnZXRUeXBlQW5ub3RhdGlvbnMoSVR5cGUgdHlwZSk7DQotDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SU1ldGhvZD4+IGdldE1ldGhvZEFubm90YXRpb25zKElNZXRob2QgbWV0aG9kKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JTG9jYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNDc2MzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgaG9sZHMgaW5mb3JtYXRpb24gdG8gbG9jYXRlIHNwZWNpZmljIHJlZ2lvbiBpbiB0aGUgc291cmNlIGNvZGUgDQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElMb2NhdG9yDQotew0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbGluZSBudW1iZXIgaW4gdGhlIHNvdXJjZSB3aGVyZSB0aGUgcmVnaW9uIHBvaW50ZWQgYnkgdGhpcyBsb2NhdG9yIHN0YXJ0cyAgDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKTsNCi0JDQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoaXMgcmVnaW9uIGluIHNvdXJjZSBjb2RlDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFN0YXJ0UG9zaXRpb24oKTsNCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbg0KLQkgKi8NCi0JcHVibGljIGludCBnZXRMZW5ndGgoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JUGFyYW1WYWx1ZVBhaXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVBhcmFtVmFsdWVQYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmZTZlNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JUGFyYW1WYWx1ZVBhaXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgcGFyYW0gdmFsdWUgcGFpciBpbiBhbm5vdGF0aW9uLiBQYXJhbSB2YWx1ZSBwYWlyIGhhcyB0aGUgZm9sbG93aW5nIGZvcm06IHBhcmFtPXZhbHVlDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGludGVyZmFjZSBJUGFyYW1WYWx1ZVBhaXINCi17DQotCS8qKg0KLQkgKiBAcmV0dXJuIHBhcmFtIG5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0oKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgSVZhbHVlIGdldFZhbHVlKCk7DQotCQ0KLQkvKioNCi0JICogR2V0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlLg0KLQkgKiANCi0JICogQHJldHVybiBJTG9jYXRvcg0KLQkgKi8NCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyYzRhNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgYXJ0aWZhY3QgdmFsdWUgaW4gYW5ub3RhdGlvbi4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElWYWx1ZQ0KLXsNCi0JLyoqDQotCSAqIE9idGFpbnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZhbHVlLiBUaGUgb2J0YWluZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGNhbiBsYXRlciBvbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlDQotCSAqIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgY29uc2lkZWRlcmVkIGVxdWFsIHRvIHRoZSByZXR1cm5lZCB2YWx1ZS4NCi0JICogPHA+DQotCSAqIAk8Yz5AQW5ub3RhdGlvbkV4YW1wbGUoMSk8L2M+IC8vYW5ub2F0aW9uIHdpdGggb25lIGF0dHJpYnV0ZS9wYXJhbWV0ZXIgY2FsbGVkICJ2YWx1ZSIgd2l0aCB2YWx1ZSBvZiAiMSIuIA0KLQkgKiA8L3A+DQotCSAqIFRoZSB0b1N0cmluZyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAiMSIsIHdoaWNoIGNhbiBsYXRlciBvbiBiZSB1c2VkIGJ5IEludGVnZXIucGFyc2UoU3RyaW5nKSB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgSW50ZWdlcg0KLQkgKiBlcXVhbCB0byB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIGludGVnZXIgbGl0ZXJhbCAxDQotCSAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7DQotCQ0KLQkvKioNCi0JICogR2V0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlLg0KLQkgKiANCi0JICogQHJldHVybiBJTG9jYXRvcg0KLQkgKi8NCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKTsNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvY2xhenovQVNUVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvY2xhenovQVNUVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhkNTAwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2NsYXp6L0FTVFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuY2xheno7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyB0aGF0IHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIGZvciB7QGxpbmsgQVNUfSBwcm9jZXNzaW5nLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQVNUVXRpbHMgDQotew0KLQlwcml2YXRlIHN0YXRpYyBBU1RVdGlscyBpbnN0YW5jZTsNCi0JDQotCXByaXZhdGUgQVNUVXRpbHMoKSB7DQotCQkvLyBkaXNhYmxlIGNvbnN0cnVjdGlvbg0KLQl9DQotCQ0KLQkvKioNCi0JICogQHJldHVybiBjcmVhdGUgbmV3IGluc3RhbmNlIGZvciB0aGlzIHV0aWxpdHkNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgQVNUVXRpbHMgZ2V0SW5zdGFuY2UoKSB7DQotCQlpZihpbnN0YW5jZT09bnVsbCkgew0KLQkJCWluc3RhbmNlID0gbmV3IEFTVFV0aWxzKCk7IA0KLQkJfQ0KLQkJcmV0dXJuIGluc3RhbmNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBBU1QgdHJlZSBvdXQgb2Yge0BsaW5rIEZpbGV9IGluc3RhbmNlLg0KLQkgKiBAcGFyYW0gc291cmNlRmlsZSBqYXZhIGNsYXNzIGZpbGUgIA0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yDQotCSAqIEByZXR1cm4gY3JlYXRlZCB7QGxpbmsgQVNUTm9kZX0NCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIEFTVE5vZGUgY3JlYXRlQVNUKGZpbmFsIEZpbGUgc291cmNlRmlsZSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHNvdXJjZUZpbGUsICJzb3VyY2VGaWxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJZmluYWwgQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOw0KLQkJcGFyc2VyLnNldFNvdXJjZShGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWxlQ29udGVudChzb3VyY2VGaWxlKS50b0NoYXJBcnJheSgpKTsNCi0JCXJldHVybiBwYXJzZXIuY3JlYXRlQVNUKG1vbml0b3IpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBBU1R9IHRyZWUgb3V0IG9mIHtAbGluayBJVHlwZX0gaW5zdGFuY2UuDQotCSAqIEBwYXJhbSBzb3VyY2VUeXBlIGphdmEgY2xhc3MNCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcg0KLQkgKiBAcmV0dXJuIGNyZWF0ZWQge0BsaW5rIEFTVE5vZGV9IGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZUN1LCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHNvdXJjZUN1LCAic291cmNlQ3UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZmluYWwgQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOw0KLQkJcGFyc2VyLnNldFNvdXJjZShzb3VyY2VDdSk7DQotCQlwYXJzZXIuc2V0QmluZGluZ3NSZWNvdmVyeShmYWxzZSk7DQotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdClwYXJzZXIuY3JlYXRlQVNUKG1vbml0b3IpOw0KLQl9CQkNCi0JDQotCS8qKg0KLQkgKiBGaW5kcyB7QGxpbmsgRmllbGREZWNsYXJhdGlvbn0gaW4ge0BsaW5rIFR5cGVEZWNsYXJhdGlvbn0gd2l0aCBuYW1lIDxjb2RlPmZpZWxkVHlwZS5nZXRFbGVtZW50TmFtZSgpPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBmaWVsZFR5cGUNCi0JICogQHBhcmFtIHR5cGVEZWNsYXJhdGlvbg0KLQkgKiBAcmV0dXJuIGZvdW5kIG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIEZpZWxkRGVjbGFyYXRpb24gZ2V0RmllbGREZWNsYXJhdGlvbihmaW5hbCBJRmllbGQgZmllbGRUeXBlLCBmaW5hbCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKQ0KLQl7DQotCQlmb3IgKEZpZWxkRGVjbGFyYXRpb24gZmQgOiB0eXBlRGVjbGFyYXRpb24uZ2V0RmllbGRzKCkpDQotCQl7DQotCQkJZm9yIChPYmplY3QgZnIgOiBmZC5mcmFnbWVudHMoKSkNCi0JCQl7DQotCQkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2ZGYgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcjsNCi0JCQkJaWYgKHZkZi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGZpZWxkVHlwZS5nZXRFbGVtZW50TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZkOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIGJvb2xlYW4gY29tcGFyZU1ldGhvZFBhcmFtcyhmaW5hbCBJTWV0aG9kIG1ldGhvZFR5cGUsIGZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG1kKQ0KLQl7DQotCQlMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IGxpc3QgPSBtZC5wYXJhbWV0ZXJzKCk7DQotCQlpZiAobGlzdC5zaXplKCkgPT0gbWV0aG9kVHlwZS5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZFR5cGUuZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspDQotCQkJew0KLQkJCQlpZiAoIWlzU2FtZVBhcmFtKHBhcmFtZXRlclR5cGVzW2ldLCAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgbGlzdC5nZXQoaSkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCX0NCi0JCQl9DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBpc1NhbWVQYXJhbShmaW5hbCBTdHJpbmcgdHlwZSwgZmluYWwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzdkRlY2wpDQotCXsNCi0JCXJldHVybiB0eXBlLmVxdWFscyhnZXRUeXBlU2lnbmF0dXJlKHN2RGVjbCkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHR5cGUgc2lnbmF0dXJlIGZyb20ge0BsaW5rIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb259LiBBcyB7QGxpbmsgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbn0gcmV0dXJucyBvbmx5IHRoZSBjbGVhbiB0eXBlIGluIGNhc2UNCi0JICogZGVjbGFyYXRpb24gb2YgdHlwZSA8dHQ+aW50IHBhcmFBcnJbXVtdPC90dD4gaXMgaW4gY29kZSB0aGUgbWV0aG9kIGFkZHMgYXJyYXkgaWRlbnRpZmllcnMgZm9yIHR5cGUgZGVjbGFyYXRpb24gaW50IHRoaXMgY2FzZS4NCi0JICogDQotCSAqIEBwYXJhbSBzdkRlY2wNCi0JICogQHJldHVybiB0aGUgc2lnbmF0eXJlIGZvciB0aGUgdHlwZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKGZpbmFsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc3ZEZWNsKQ0KLQl7DQotCQlTdHJpbmcgdHlwZU5hbWUgPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShzdkRlY2wuZ2V0VHlwZSgpLnRvU3RyaW5nKCksIGZhbHNlKTsNCi0NCi0JCWlmIChzdkRlY2wuZ2V0RXh0cmFEaW1lbnNpb25zKCkgPiAwICYmIHR5cGVOYW1lLmluZGV4T2YoJ1snKSA9PSAtMSkNCi0JCXsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN2RGVjbC5nZXRFeHRyYURpbWVuc2lvbnMoKTsgaSsrKQ0KLQkJCXsNCi0JCQkJdHlwZU5hbWUgPSAiWyIgKyB0eXBlTmFtZTsvLyAkSkwtU1RSX0NPTkNBVCQgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiB0eXBlTmFtZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEZpbmRzIHtAbGluayBNZXRob2REZWNsYXJhdGlvbn0gaW4ge0BsaW5rIFR5cGVEZWNsYXJhdGlvbn0gaGF2aW5nIG5hbWUgPGNvZGU+bWV0aG9kVHlwZS5nZXRFbGVtZW50TmFtZSgpPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXRob2RUeXBlDQotCSAqIEBwYXJhbSB0eXBlRGVjbGFyYXRpb24NCi0JICogQHJldHVybiBmb3VuZCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyAgTWV0aG9kRGVjbGFyYXRpb24gZ2V0TWV0aG9kRGVjbGFyYXRpb24oZmluYWwgSU1ldGhvZCBtZXRob2RUeXBlLCBmaW5hbCBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKQ0KLQl7DQotCQlmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1kIDogdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKSkNCi0JCXsNCi0JCQlpZiAobWQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhtZXRob2RUeXBlLmdldEVsZW1lbnROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJaWYgKGNvbXBhcmVNZXRob2RQYXJhbXMobWV0aG9kVHlwZSwgbWQpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gbWQ7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHJpZXZlcyB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSBmcm9tIHtAbGluayBDb21waWxhdGlvblVuaXR9IHdpdGggbmFtZSA8dHQ+Y2xhc3NOYW1lPC90dD4NCi0JICogDQotCSAqIEBwYXJhbSBjbGFzc05hbWUNCi0JICogQHBhcmFtIHVuaXQNCi0JICogQHJldHVybiBmb3VuZCB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgQ29tcGlsYXRpb25Vbml0IHVuaXQpDQotCXsNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG51bGw7DQotCQkvLyBsb29raW5nIHVwIHRoZSBzZWxlY3RlZCB0eXBlDQotCQlmb3IgKE9iamVjdCB0eXBlT2JqZWN0IDogdW5pdC50eXBlcygpKQ0KLQkJew0KLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHRtcFR5cGVEZWNsYXJhdGlvbiA9IChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbikgdHlwZU9iamVjdDsNCi0JCQlpZiAodG1wVHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkNCi0JCQl7DQotCQkJCXR5cGVEZWNsYXJhdGlvbiA9IHRtcFR5cGVEZWNsYXJhdGlvbjsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpDQotCQl7DQotCQkJTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gbGlzdCA9IHVuaXQudHlwZXMoKTsNCi0JCQl0eXBlRGVjbGFyYXRpb24gPSBnZXRJbm5lckNsYXNzKGxpc3QudG9BcnJheShuZXcgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bbGlzdC5zaXplKCldKSwgY2xhc3NOYW1lKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRJbm5lckNsYXNzKGZpbmFsIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uW10gdHlwZXMsIGZpbmFsIFN0cmluZyBjbGFzc05hbWUpDQotCXsNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7DQotCQlmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZSA6IHR5cGVzKQ0KLQkJew0KLQkJCWlmIChhYnN0cmFjdFR5cGUuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7DQotCQkJCXJldHVybiBhYnN0cmFjdFR5cGU7DQotCQkJfQ0KLQ0KLQkJCWlmICghKGFic3RyYWN0VHlwZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCXJlc3VsdCA9IGdldElubmVyQ2xhc3MoKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uW10pICgoVHlwZURlY2xhcmF0aW9uKSBhYnN0cmFjdFR5cGUpLmdldFR5cGVzKCksIGNsYXNzTmFtZSk7DQotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZG9tL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlYTdiNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5kb20udmFsaWRhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgRG9tVmFsaWRhdGlvbkNvbnN0YW50cyANCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLldzVmFsaWRhdG9yTWFya2VyIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT04gPSAiaW1wbGVtZW50YXRpb24iOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU19DT05TVFJBSU5UX0lEID0gIndlYlNlcnZpY2VDb25zdHJhaW50IjsgLy8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUF9DT05TVFJBSU5UX0lEID0gIndlYlBhcmFtQ29uc3RyYWludCI7IC8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fQ09OU1RSQUlOVF9JRCA9ICJ3ZWJNZXRob2RDb25zdHJhaW50IjsgLy8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUlfQ09OU1RSQUlOVF9JRCA9ICJzZWlDb25zdHJhaW50IjsgLy8kTk9OLU5MUy0xJA0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2V4Y2VwdGlvbi9Mb2NhbGl6ZWRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL0xvY2FsaXplZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2UwODQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL0xvY2FsaXplZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLQ0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgYmFzZSBjbGFzcyBmb3IgYWxsIENIRUNLRUQgZXhjZXB0aW9ucyBmb3IgdGhlIFdTIFRvb2xzDQotICogdG9vbHNldC4gVGhpcyBleGNlcHRpb24gY29ycmVjdGx5IG92ZXJyaWRlcyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkNCi0gKiBvZiBFeGNlcHRpb24gY2xhc3MgYW5kIHByb3ZpZGUgcHJvcGVyIGxvY2FsaXplZCBtZXNzYWdlLg0KLSAqIFRvIGFjaGlldmUgdGhhdCB0aGVyZSBpcyBhIGxpbWl0YXRpb24gLSBpdCB3aWxsIGJlIGltcG9zc2libGUgdG8gcmV0dXJuIGxvY2FsaXplZA0KLSAqIG1lc3NhZ2UgaWYgaXQgaGF2ZW4ndCBiZWVuIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb2YgZXhjZXB0aW9uLCBzbyB0aGVyZSBpcyBubw0KLSAqIGNvbnN0cnVjdG9yIHdpdGhvdXQgbG9jYWxpemVkIG1lc3NhZ2UuDQotICogDQotICogQGF1dGhvciBNbGFkZW4gVG9tb3YNCi0gKiovDQotDQotcHVibGljIGNsYXNzIExvY2FsaXplZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGV4Y2VwdGlvbiB3aXRoIGFiaWxpdHkgdG8gcHJvdmlkZSBsb2NhbGl6ZWQgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBkZXRhaWwgbWVzc2FnZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbA0KLSAgICAgKiAgICAgICAgIGJ5IHRoZSB7QGxpbmsgI2dldE1lc3NhZ2UoKX0gbWV0aG9kKQ0KLQkgKiBAcGFyYW0gbG9jYWxpemVkTWVzc2FnZSAtIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbA0KLSAgICAgKiAgICAgICAgIGJ5IHRoZSB7QGxpbmsgI2dldExvY2FsaXplZE1lc3NhZ2UoKX0gbWV0aG9kKQ0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgLSBpbiBjYXNlIGxvY2FsaXplZCBtZXNzYWdlIGlzIG51bGwNCi0JICogKi8NCi0JcHVibGljIExvY2FsaXplZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpIHsNCi0JCXN1cGVyKG1lc3NhZ2UpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGxvY2FsaXplZE1lc3NhZ2UsICJsb2NhbGl6ZWRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMubG9jYWxpemVkTWVzc2FnZSA9IGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgZXhjZXB0aW9uIHdpdGggYWJpbGl0eSB0byBwcm92aWRlIGxvY2FsaXplZCBtZXNzYWdlDQotCSAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIGRldGFpbCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlIC0gdGhlIGxvY2FsaXplZCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIEBwYXJhbSBjYXVzZSAtICBjYXVzZSB0aGUgY2F1c2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwgYnkgdGhlDQotICAgICAqICAgICAgICAge0BsaW5rICNnZXRDYXVzZSgpfSBtZXRob2QpLg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgLSBpbiBjYXNlIGxvY2FsaXplZCBtZXNzYWdlIGlzIG51bGwNCi0JICogKi8NCi0JDQotCXB1YmxpYyBMb2NhbGl6ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShsb2NhbGl6ZWRNZXNzYWdlLCAibG9jYWxpemVkTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLmxvY2FsaXplZE1lc3NhZ2UgPSBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyBsb2NhbGl6ZWQgbWVzc2FnZSB3aXRoIHdoaWNoIHRoZSBleGNlcHRpb24gd2FzIGNvbnN0cnVjdGVkLiovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7DQotCQlyZXR1cm4gbG9jYWxpemVkTWVzc2FnZTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2V4Y2VwdGlvbi9NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTIxMjk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEluZGljYXRlcyB0aGF0IGEgcmVzb3VyY2Ugb2YgYW55IGtpbmQgY291bGRuJ3QgYmUgZm91bmQgYnV0IHRoaXMgd2FzIGV4cGVjdGVkLg0KLSAqIA0KLSAqIEBhdXRob3IgSm9lcmcgRGVobWVsDQotICovDQotcHVibGljIGNsYXNzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleHRlbmRzIExvY2FsaXplZEV4Y2VwdGlvbg0KLXsNCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggYSBtZXNzYWdlIGFuZCBhIGxvY2FsaXplZCBtZXNzYWdlLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBlcnJvciBtZXNzYWdlDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlDQotCSAqICAgICAgICAgICAgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICovDQotCXB1YmxpYyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlLCBsb2NhbGl6ZWRNZXNzYWdlKTsJCQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggbWVzc2FnZSwgbG9jYWxpemVkIG1lc3NhZ2UgYW5kIGNhdXNpbmcgZXhjZXB0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBlcnJvciBtZXNzYWdlDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlDQotCSAqICAgICAgICAgICAgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICogQHBhcmFtIGNhdXNlDQotCSAqICAgICAgICAgICAgY2F1c2luZyBleGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCXN1cGVyKG1lc3NhZ2UsIGxvY2FsaXplZE1lc3NhZ2UsIGNhdXNlKTsJCQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZmFjZXRzL0ZhY2V0VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZmFjZXRzL0ZhY2V0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTg4ZGE3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9GYWNldFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBGYWNldFV0aWxzIGltcGxlbWVudHMgSUZhY2V0VXRpbHMNCi17DQotCS8qKg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGlmIDxjPnByb2plY3Q8L2M+IG9yIDxjPmZhY2V0SWRzPC9jPiBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGYWNldChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcuLi4gZmFjZXRJZHMpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShwcm9qZWN0KTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmYWNldElkcyk7DQotDQotCQlpZiAoIWlzRmFjZXRlZFByb2plY3QocHJvamVjdCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gZ2V0RmFjZXRlZFByb2plY3QocHJvamVjdCk7DQotCQlmb3IgKFN0cmluZyBmYWNldElkIDogZmFjZXRJZHMpDQotCQl7DQotCQkJZmluYWwgSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChmYWNldElkKTsNCi0JCQlpZiAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGZhY2V0KSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldElkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBmYWNldFZlcnNpb24sIGZhY2V0SWQsIHRydWUpOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzRmFjZXRlZFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJU2V0PElGYWNldGVkUHJvamVjdD4gZmFjZXRlZFByb2plY3RzID0gZ2V0QWxsV29ya3NwYWNlRmFjZXRlZFByb2plY3RzKCk7DQotCQlmaW5hbCBJdGVyYXRvcjxJRmFjZXRlZFByb2plY3Q+IGkgPSBmYWNldGVkUHJvamVjdHMuaXRlcmF0b3IoKTsNCi0JCXdoaWxlIChpLmhhc05leHQoKSkNCi0JCXsNCi0JCQlmaW5hbCBJRmFjZXRlZFByb2plY3QgZnAgPSAoSUZhY2V0ZWRQcm9qZWN0KSBpLm5leHQoKTsNCi0JCQlpZiAocHJvamVjdC5lcXVhbHMoZnAuZ2V0UHJvamVjdCgpKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldElkLCBib29sZWFuIGFjY2VwdEhpZ2hlckZhY2V0VmVyc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHByb2plY3QpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZhY2V0VmVyc2lvbik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmFjZXRJZCk7DQotDQotCQlpZiAoIWlzRmFjZXRlZFByb2plY3QocHJvamVjdCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBhbGxGYWNldHNWZXJzaW9ucyA9IGdldFByb2plY3RGYWNldHMocHJvamVjdCk7DQotCQlmb3IgKElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlciA6IGFsbEZhY2V0c1ZlcnNpb25zKQ0KLQkJew0KLQkJCWlmICh2ZXIuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKS5lcXVhbHMoZmFjZXRJZCkpDQotCQkJew0KLQkJCQlyZXR1cm4gaXNGYWNldEFjY2VwdGFibGUodmVyLCBmYWNldFZlcnNpb24sIGFjY2VwdEhpZ2hlckZhY2V0VmVyc2lvbik7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBpc0ZhY2V0QWNjZXB0YWJsZShJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldFZlcnNpb25JZCwgYm9vbGVhbiBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24pDQotCQkJCQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IGZhY2V0VmVyc2lvbiAhPSBudWxsOw0KLQ0KLQkJLy8gQ2hlY2sgZm9yIGV4YWN0IHZlcnNpb24NCi0JCWlmICghYWNjZXB0SGlnaGVyRmFjZXRWZXJzaW9uKQ0KLQkJew0KLQkJCXJldHVybiBmYWNldFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpLmVxdWFscyhmYWNldFZlcnNpb25JZCk7DQotCQl9DQotDQotCQlDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvciA9IGZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRWZXJzaW9uQ29tcGFyYXRvcigpOw0KLQkJU3RyaW5nIGN1cnJlbnRGYWNldFZlcnNpb24gPSBmYWNldFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpOw0KLQkJcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZShjdXJyZW50RmFjZXRWZXJzaW9uLCBmYWNldFZlcnNpb25JZCkgPj0gMDsNCi0JfQ0KLQ0KLQlwcml2YXRlIElGYWNldGVkUHJvamVjdCBnZXRGYWNldGVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOw0KLQl9DQotDQotCXByaXZhdGUgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRQcm9qZWN0RmFjZXRzKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydCBpc0ZhY2V0ZWRQcm9qZWN0KHByb2plY3QpOw0KLQ0KLQkJcmV0dXJuIGdldEZhY2V0ZWRQcm9qZWN0KHByb2plY3QpLmdldFByb2plY3RGYWNldHMoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFNldDxJRmFjZXRlZFByb2plY3Q+IGdldEFsbFdvcmtzcGFjZUZhY2V0ZWRQcm9qZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRGYWNldGVkUHJvamVjdHMoKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9JRmFjZXRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9mYWNldHMvSUZhY2V0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODcyNzc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9JRmFjZXRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotCQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhY2V0VXRpbHMNCi17DQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgRUpCMzAgZmFjZXQgSUQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl8zMF9GQUNFVF9JRCA9ICJqc3QuZWpiIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBFSkIzMCBmYWNldCB2ZXJzaW9uIDMuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCXzMwX0ZBQ0VUX1ZFUlNJT04gPSAiMy4wIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBXZWIgMi41IGZhY2V0IElEDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfMjVfRkFDRVRfSUQgPSAianN0LndlYiI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgV2ViIGZhY2V0IHZlcnNpb24gMi41DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfMjVfRkFDRVRfVkVSU0lPTiA9ICIyLjUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdGFudCBmb3IgQXBwbGljYXRpb24gY2xpZW50IGZhY2V0IElEDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfMjVfRkFDRVRfSUQgPSAianN0LmFwcGNsaWVudCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBBcHBsaWNhdGlvbiBjbGllbnQgZmFjZXQgdmVyc2lvbiAyLjUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF8yNV9GQUNFVF9WRVJTSU9OCT0gIjUuMCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPnByb2plY3Q8L2NvZGU+IGhhcyBhIGZhY2V0IHdpdGggaWQgPGNvZGU+ZmFjZXRJZDwvY29kZT4gd2l0aCB2ZXJzaW9uIDxjb2RlPmZhY2V0VmVyc2lvbjwvY29kZT4NCi0JICogSW4gY2FzZSB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgbm90IGEgZmFjZXRlZCBwcm9qZWN0LCBmYWxzZSBpcyByZXR1cm5lZCANCi0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGlzIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcgaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBmYWNldFZlcnNpb24sIGZhY2V0SWQsIGZhbHNlKQ0KLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdA0KLQkgKiBAcGFyYW0gZmFjZXRWZXJzaW9uIHRoZSBmYWNldCB2ZXJzaW9uDQotCSAqIEBwYXJhbSBmYWNldElkIHRoZSBmYWNldCBpZA0KLQkgKiBAcmV0dXJuIHRydWUgaW4gY2FzZSB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgYSBmYWNldGVkIHByb2plY3QgYW5kIGhhcyB0aGUgZmFjZXQgd2l0aCB0aGUgdmVyc2lvbiBzcGVjaWZpZWQ7IGZhbHNlIG90aGVyd2lzZQ0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFueSBvZiB0aGUgaW5wdXQgcGFyYW1ldGVycyBpcyBudWxsDQotCSAqIEBzZWUgSUZhY2V0VXRpbHMjaGFzRmFjZXRXaXRoVmVyc2lvbihJUHJvamVjdCwgU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldElkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0JDQotCS8qKg0KLQkgKiBDaGVja3Mgd2hldGhlciA8Y29kZT5wcm9qZWN0PC9jb2RlPiBoYXMgYSBmYWNldCB3aXRoIGlkIDxjb2RlPmZhY2V0SWQ8L2NvZGU+IHdpdGggdmVyc2lvbiA8Y29kZT5mYWNldFZlcnNpb248L2NvZGU+DQotCSAqIEluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIG5vdCBhIGZhY2V0ZWQgcHJvamVjdCwgZmFsc2UgaXMgcmV0dXJuZWQgDQotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0DQotCSAqIEBwYXJhbSBmYWNldFZlcnNpb24gdGhlIGZhY2V0IHZlcnNpb24NCi0JICogQHBhcmFtIGZhY2V0SWQgdGhlIGZhY2V0IGlkDQotCSAqIEBwYXJhbSBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBoaWdoZXIgZmFjZXQgdmVyc2lvbnMgYXJlIGFjY2VwdGFibGUNCi0JICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgZmFjZXRlZCBwcm9qZWN0IGFuZCBoYXMgdGhlIGZhY2V0IHdpdGggdGhlIHZlcnNpb24gc3BlY2lmaWVkOyBmYWxzZSBvdGhlcndpc2UNCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiBhbnkgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaGFzRmFjZXRXaXRoVmVyc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmFjZXRWZXJzaW9uLCBTdHJpbmcgZmFjZXRJZCwgYm9vbGVhbiBhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgZmFjZXRlZCBwcm9qZWN0DQotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0DQotCSAqIEByZXR1cm4NCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+cHJvamVjdDwvY29kZT4gaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNGYWNldGVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25CYXNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25CYXNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmVkYTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uQmFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25CYXNlOw0KLQ0KLS8qKg0KLSAqIEJhc2Uge0BsaW5rIElBbm5vdGF0aW9uQmFzZX0gaW1wbGVtZW50YXRpb24NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5ub3RhdGlvbkJhc2VJbXBsPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGV4dGVuZHMgVmFsdWVJbXBsDQotew0KLQlwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uTmFtZTsvLyBDb250YWluZXIgZm9yIEFubm90YXRpb24gTmFtZTsNCi0JcHJvdGVjdGVkIFQgamF2YUVsZW1lbnQ7IC8vIENvbmF0aW5lciBmb3IgdGhlIHBhcmVudCBJSmF2YUVsZW1lbnQ7DQotCS8vcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvblN0cmluZ1ZhbHVlOy8vQ29uYXRpbmVyIHRvIGN1cnJlbnQgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYW5ub3RhdGlvbg0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5hbm5vdGF0aW9uTmFtZTwvY29kZT4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5hbm5vdGF0aW9uTmFtZTwvY29kZT4gaXMgZW1wdHkgU3RyaW5nLg0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25CYXNlSW1wbChTdHJpbmcgYW5ub3RhdGlvbk5hbWUpDQotCXsNCi0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRXh0cmFjdHMgb25seSB0aGUgQW5ub3RhdGlvbiBuYW1lIGluIGNhc2UgaXQgaXMgaW4gZnVsbHkgcXVhbGlmaWVkIGZvcm0uDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgQW5ub3RhdGlvbiBuYW1lLg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGVBbm5vdGF0aW9uTmFtZSgpDQotCXsNCi0JCWludCBsYXN0RG90SW5kZXggPSBhbm5vdGF0aW9uTmFtZS5sYXN0SW5kZXhPZihET1QpOw0KLQ0KLQkJaWYgKGxhc3REb3RJbmRleCA9PSAtMSkNCi0JCXsNCi0JCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWU7DQotCQl9DQotDQotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCArIDEpOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKQ0KLQl7DQotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkZHMgQW5ub3RhdGlvbiB0byBzcGVjaWZpYyBJSmF2YUVsZW1lbnQuDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0PmphdmFFbGVtZW50PC90dD4gaXMgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IElUeXBlLCBJTWV0aG9kLCBJRmllbGQsIElUeXBlUGFyYW1ldGVyLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShUIGphdmFFbGVtZW50KQ0KLQl7DQotCQlzZXRKYXZhRWxlbWVudChqYXZhRWxlbWVudCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0SmF2YUVsZW1lbnQoVCBqYXZhRWxlbWVudCkNCi0Jew0KLQkJaWYgKGphdmFFbGVtZW50ID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXZhRWxlbWVudCBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKCEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiamF2YUVsZW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJdGhpcy5qYXZhRWxlbWVudCA9IGphdmFFbGVtZW50Ow0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIGFubm90YXRpb25OYW1lLmhhc2hDb2RlKCk7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmogPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBBbm5vdGF0aW9uQmFzZUltcGw8VD4gb3RoZXIgPSAgKEFubm90YXRpb25CYXNlSW1wbDxUPilvYmo7DQotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUuZXF1YWxzKG90aGVyLmFubm90YXRpb25OYW1lKTsNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQzYjVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotLyoqDQotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBbm5vdGF0aW9ufQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uSW1wbDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBleHRlbmRzIEFubm90YXRpb25CYXNlSW1wbDxUPiBpbXBsZW1lbnRzIElBbm5vdGF0aW9uPFQ+DQotew0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb24jZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwYXJhbSkNCi0Jew0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFpciA6IGdldFBhcmFtVmFsdWVQYWlycygpKQ0KLQkJew0KLQkJCWlmIChwYXJhbS5lcXVhbHMocGFpci5nZXRQYXJhbSgpKSkNCi0JCQl7DQotCQkJCXJldHVybiBwYWlyLmdldFZhbHVlKCkhPW51bGwgPyBwYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKSA6IG51bGw7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHJpdmF0ZSBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnM7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lIC0NCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiBhbm5vdGF0aW9uDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlUGFpcnMgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJhbT12YWx1ZSBwYXJpcw0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25JbXBsKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzKQ0KLQl7DQotCQlzdXBlcihhbm5vdGF0aW9uTmFtZSk7DQotCQl0aGlzLnBhcmFtVmFsdWVQYWlycyA9IHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQ0KLQlwdWJsaWMgU2V0PElQYXJhbVZhbHVlUGFpcj4gZ2V0UGFyYW1WYWx1ZVBhaXJzKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRQYXJhbVZhbHVlUGFpcnMoU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzKQ0KLQl7DQotCQl0aGlzLnBhcmFtVmFsdWVQYWlycyA9IHBhcmFtVmFsdWVQYWlyczsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90ID0gYXN0Lm5ld05vcm1hbEFubm90YXRpb24oKTsNCi0JCWJvb2xlYW4gd2FzQWRkZWQgPSBhZGRJbXBvcnRzKGFzdCwgdW5pdCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlpZiAod2FzQWRkZWQpDQotCQl7DQotCQkJKChTaW1wbGVOYW1lKSBhbm5vdC5nZXRUeXBlTmFtZSgpKS5zZXRJZGVudGlmaWVyKGdldFNpbXBsZUFubm90YXRpb25OYW1lKCkpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJTmFtZSBuYW1lID0gYXN0Lm5ld05hbWUoZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQkJYW5ub3Quc2V0VHlwZU5hbWUobmFtZSk7DQotCQl9DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcmFtVmFsdWVQYWlycykNCi0JCXsNCi0JCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IGFzdC5uZXdNZW1iZXJWYWx1ZVBhaXIoKTsNCi0JCQlwYWlyLmdldE5hbWUoKS5zZXRJZGVudGlmaWVyKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkpOw0KLQkJCXBhaXIuc2V0VmFsdWUoKChWYWx1ZUltcGwpIHBhcmFtVmFsdWVQYWlyLmdldFZhbHVlKCkpLmdldEV4cHJlc3Npb24odW5pdCwgYXN0KSk7DQotCQkJYW5ub3QudmFsdWVzKCkuYWRkKHBhaXIpOw0KLQkJfQ0KLQkJcmV0dXJuIGFubm90Ow0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJaWYocGFyYW1WYWx1ZVBhaXJzID09IG51bGwgfHwgcGFyYW1WYWx1ZVBhaXJzLnNpemUoKSA8IDEpDQotCQl7DQotCQkJcmV0dXJuIDMxICogc3VwZXIuaGFzaENvZGUoKTsNCi0JCX0NCi0JCXJldHVybiAzMSAqIHN1cGVyLmhhc2hDb2RlKCkgKyBBcnJheXMuaGFzaENvZGUocGFyYW1WYWx1ZVBhaXJzLnRvQXJyYXkobmV3IElQYXJhbVZhbHVlUGFpcltwYXJhbVZhbHVlUGFpcnMuc2l6ZSgpXSkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKCFzdXBlci5lcXVhbHMob2JqKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBBbm5vdGF0aW9uSW1wbDw/PiBvdGhlciA9IChBbm5vdGF0aW9uSW1wbDw/Pikgb2JqOw0KLQkJcmV0dXJuIChBcnJheXMuZXF1YWxzKHBhcmFtVmFsdWVQYWlycy50b0FycmF5KG5ldyBJUGFyYW1WYWx1ZVBhaXJbcGFyYW1WYWx1ZVBhaXJzLnNpemUoKV0pLCBvdGhlci5wYXJhbVZhbHVlUGFpcnMudG9BcnJheShuZXcgSVBhcmFtVmFsdWVQYWlyW3BhcmFtVmFsdWVQYWlycy5zaXplKCldKSkpOw0KLQl9DQotDQotCXB1YmxpYyBUIGdldEFwcGxpZWRFbGVtZW50KCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuamF2YUVsZW1lbnQ7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25JbnNwZWN0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkluc3BlY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmM4NjdlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkluc3BlY3RvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklJbXBvcnREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZFR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi0NCi0vKioNCi0gKiBDbGFzcywgd2hpY2ggaXMgbWFkZSB0byBsb2FkIGFuZCByZXR1cm4gYW5ub3RhdGlvbnMgZnJvbSBhIGdpdmVuIElKYXZhRWxlbWV0Lg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCBpbXBsZW1lbnRzIElBbm5vdGF0aW9uSW5zcGVjdG9yDQotew0KLQlwcml2YXRlIElUeXBlIGlUeXBlOw0KLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBjVW5pdDsNCi0NCi0JcHVibGljIEFubm90YXRpb25JbnNwZWN0b3JJbXBsKGZpbmFsIElUeXBlIHR5cGUpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbSh0eXBlLCAidHlwZSIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCXRoaXMuaVR5cGUgPSB0eXBlOw0KLQl9CQ0KLQ0KLQlwdWJsaWMgSUFubm90YXRpb248SU1ldGhvZD4gaW5zcGVjdE1ldGhvZChmaW5hbCBJTWV0aG9kIG1ldGhvZCwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obWV0aG9kLCAibWV0aG9kIik7IC8vJE5PTi1OTFMtMSQNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShhbm5vdGF0aW9uUU5hbWUsICJhbm5vdGF0aW9uUU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYoIShtZXRob2QgaW5zdGFuY2VvZiBJTWV0aG9kKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRob2QgYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgVHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIGFyZ3VtZW50IGlzIG5vdCB3aXRoIHByb3BwZXIgdmFsdWUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKG1ldGhvZCwgbWV0aG9kLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCksIGFubm90YXRpb25RTmFtZSk7CQkNCi0JfQkNCi0NCi0JcHVibGljIENvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGluc3BlY3RNZXRob2QoSU1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKG1ldGhvZCwgIm1ldGhvZCIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWlmKCEobWV0aG9kIGluc3RhbmNlb2YgSU1ldGhvZCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0aG9kIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IFR5cGUhIik7CS8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBnZXRGcm9tTWVtYmVyKG1ldGhvZCwgbWV0aG9kLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyBJQW5ub3RhdGlvbjxJRmllbGQ+IGluc3BlY3RGaWVsZChmaW5hbCBJRmllbGQgZmllbGQsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oZmllbGQsICJmaWVsZCIpOyAvLyROT04tTkxTLTEkDQotCQludWxsQ2hlY2tQYXJhbShhbm5vdGF0aW9uUU5hbWUsICJhbm5vdGF0aW9uUU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaWYoIShmaWVsZCBpbnN0YW5jZW9mIElGaWVsZCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmllbGQgYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgVHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIGFyZ3VtZW50IGlzIG5vdCB3aXRoIHByb3BwZXIgdmFsdWUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBmaWVsZC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbkZyb21NZW1iZXIoZmllbGQsIGNsYXNzTmFtZSwgYW5ub3RhdGlvblFOYW1lKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJRmllbGQ+PiBpbnNwZWN0RmllbGQoSUZpZWxkIGZpZWxkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChmaWVsZCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmllbGQgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKGZpZWxkIGluc3RhbmNlb2YgSUZpZWxkKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWVsZCBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCBUeXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gZmllbGQuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCXJldHVybiBnZXRGcm9tTWVtYmVyKGZpZWxkLCBjbGFzc05hbWUpOw0KLQl9DQotDQotCXB1YmxpYyBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gaW5zcGVjdFBhcmFtKGZpbmFsIElUeXBlUGFyYW1ldGVyIHBhcmFtLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHBhcmFtLCAicGFyYW0iKTsgLy8kTk9OLU5MUy0xJA0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvblFOYW1lLCAiYW5ub3RhdGlvblFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYoIShwYXJhbSBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJhbSBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCBUeXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihhbm5vdGF0aW9uUU5hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbm5vdGF0aW9uUU5hbWUgYXJndW1lbnQgaXMgbm90IHdpdGggcHJvcHBlciB2YWx1ZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZUZyb21QYXJhbShwYXJhbSk7DQotCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uRnJvbU1lbWJlcihwYXJhbSwgY2xhc3NOYW1lLCBhbm5vdGF0aW9uUU5hbWUpOwkJDQotCX0NCi0JDQotCXB1YmxpYyBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gaW5zcGVjdFBhcmFtKElUeXBlUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChwYXJhbSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW0gc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKHBhcmFtIGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmFtIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IFR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBnZXRGcm9tTWVtYmVyKHBhcmFtLCBnZXRDbGFzc05hbWVGcm9tUGFyYW0ocGFyYW0pKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUFubm90YXRpb248SVR5cGU+IGluc3BlY3RUeXBlKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvblFOYW1lLCAiYW5ub3RhdGlvblFOYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYgKGFubm90YXRpb25RTmFtZS50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBhcmd1bWVudCBpcyBub3Qgd2l0aCBwcm9wcGVyIHZhbHVlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKGlUeXBlLCBpVHlwZS5nZXRFbGVtZW50TmFtZSgpLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGluc3BlY3RUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gZ2V0RnJvbU1lbWJlcihpVHlwZSwgaVR5cGUuZ2V0RWxlbWVudE5hbWUoKSk7DQotCX0JDQotCQ0KLQkvLyAjIGltcGxlbWVudGF0aW9uDQotCQ0KLQlwcml2YXRlIFN0cmluZyBnZXRDbGFzc05hbWVGcm9tUGFyYW0oZmluYWwgSVR5cGVQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYocGFyYW0uZ2V0RGVjbGFyaW5nTWVtYmVyKCkgaW5zdGFuY2VvZiBJTWV0aG9kKQ0KLQkJew0KLQkJCXJldHVybiBwYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHBhcmFtLmdldERlY2xhcmluZ01lbWJlcigpLmdldEVsZW1lbnROYW1lKCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldEZyb21NZW1iZXIoVCB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICghaXNTdXBwb3J0ZWRKYXZhRWxlbWVudCh0eXBlKSkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhc3NlZCBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCB0eXBlLiIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCUlDb21waWxhdGlvblVuaXQgY1VuaXQgPSBudWxsOw0KLQkJaWYodHlwZSBpbnN0YW5jZW9mIElNZW1iZXIpIHsNCi0JCQljVW5pdCA9ICgoSU1lbWJlcil0eXBlKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWNVbml0ID0gKChJVHlwZVBhcmFtZXRlcil0eXBlKS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGNVbml0ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCQl9DQotDQotCQlmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJZmluYWwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCB1bml0KTsNCi0JCQ0KLQkJc3dpdGNoKHR5cGUuZ2V0RWxlbWVudFR5cGUoKSkNCi0JCXsNCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6DQotCQkJcmV0dXJuIGdldEFubm90YXRpb25zKHR5cGUsIHR5cGVEZWNsYXJhdGlvbik7DQotCQkJDQotCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoNCi0JCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oKElGaWVsZCkgdHlwZSwgKFR5cGVEZWNsYXJhdGlvbil0eXBlRGVjbGFyYXRpb24pOw0KLQkJCXJldHVybiBnZXRBbm5vdGF0aW9ucyh0eXBlLCBmaWVsZERlY2xhcmF0aW9uKTsNCi0JCQkNCi0JCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoNCi0JCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKElNZXRob2QpIHR5cGUsIChUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKTsNCi0JCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbnModHlwZSwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLQkJCQ0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVI6DQotCQkJbWV0aG9kRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKChJTWV0aG9kKSgoSVR5cGVQYXJhbWV0ZXIpIHR5cGUpLmdldFBhcmVudCgpLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldFBhcmFtQW5ub3RhdGlvbnModHlwZSwgbWV0aG9kRGVjbGFyYXRpb24pOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5ldyBIYXNoU2V0PElBbm5vdGF0aW9uPFQ+PigpOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldEFubm90YXRpb25zKFQgaU1lbWJlciwgQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoYm9keURlY2xhcmF0aW9uICE9IG51bGwpDQotCQl7DQotCQkJTGlzdCBsaXN0ID0gYm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpOw0KLQkJCXJldHVybiBleHRyYWN0QW5ub3RhdGlvbnMoaU1lbWJlciwgbGlzdCk7DQotCQl9DQotCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldFBhcmFtQW5ub3RhdGlvbnMoVCBpTWVtYmVyLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAobWV0aG9kRGVjbGFyYXRpb24gIT0gbnVsbCkNCi0JCXsNCi0JCQlmb3IgKE9iamVjdCBwYXJhbSA6IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKSkNCi0JCQl7DQotCQkJCWlmIChwYXJhbSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gJiYNCi0JCQkJCQkoKElUeXBlUGFyYW1ldGVyKWlNZW1iZXIpLmdldEVsZW1lbnROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKXBhcmFtKS5nZXROYW1lKCkudG9TdHJpbmcoKSkpDQotCQkJCXsNCi0JCQkJCUxpc3QgbGlzdCA9ICgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyYW0pLm1vZGlmaWVycygpOw0KLQkJCQkNCi0JCQkJCXJldHVybiBleHRyYWN0QW5ub3RhdGlvbnMoaU1lbWJlciwgbGlzdCk7DQotCQkJCX0NCi0JCQl9CQkJDQotCQl9DQotCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCX0NCi0JDQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGV4dHJhY3RBbm5vdGF0aW9ucyhUIGlNZW1iZXIsIExpc3QgbGlzdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOw0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlFeHRlbmRlZE1vZGlmaWVyIGVsZW1lbnQgPSAoSUV4dGVuZGVkTW9kaWZpZXIpIGl0ZXIubmV4dCgpOw0KLQkJCWlmIChlbGVtZW50LmlzQW5ub3RhdGlvbigpKQ0KLQkJCXsNCi0JCQkJdmFsdWVzLmFkZChjb252ZXJ0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgZWxlbWVudCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCVNldDxJQW5ub3RhdGlvbjxUPj4gZXhwcmVzc2lvbnMgPSBuZXcgSGFzaFNldDxJQW5ub3RhdGlvbjxUPj4oKTsNCi0JCWZvciAoSVZhbHVlIHZhbHVlIDogdmFsdWVzKSANCi0JCXsNCi0JCQlBbm5vdGF0aW9uSW1wbDxUPiBhbm4gPSAoQW5ub3RhdGlvbkltcGw8VD4pdmFsdWU7DQotCQkJYW5uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoaU1lbWJlcik7DQotCQkJZXhwcmVzc2lvbnMuYWRkKGFubik7DQotCQl9DQotCQlyZXR1cm4gZXhwcmVzc2lvbnM7CQkNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGV4dHJhY3RTcGVjaWZpY0Fubm90YXRpb24oVCBpTWVtYmVyLCBMaXN0IGxpc3QsIElUeXBlIHR5cGUsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsNCi0JCVNldDxJVmFsdWU+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJRXh0ZW5kZWRNb2RpZmllciBlbGVtZW50ID0gKElFeHRlbmRlZE1vZGlmaWVyKSBpdGVyLm5leHQoKTsNCi0JCQlpZiAoZWxlbWVudC5pc0Fubm90YXRpb24oKSkNCi0JCQl7CQkJCQ0KLQkJCQlmaW5hbCBOYW1lIHR5cGVOYW1lID0gKChBbm5vdGF0aW9uKWVsZW1lbnQpLmdldFR5cGVOYW1lKCk7DQotCQkJCWlmIChhbm5vdGF0aW9uUU5hbWUuZW5kc1dpdGgodHlwZU5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSB7DQotCQkJCQl2YWx1ZXMuYWRkKGNvbnZlcnRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBlbGVtZW50KSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlmb3IgKElWYWx1ZSB2YWx1ZSA6IHZhbHVlcykgDQotCQl7DQotCQkJQW5ub3RhdGlvbkltcGw8VD4gdG1wQW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uSW1wbDxUPil2YWx1ZTsNCi0JCQlpZihjaGVja1NwZWNpZmljQW5ub3RhdHRpb24odG1wQW5ub3RhdGlvbiwgdHlwZSwgYW5ub3RhdGlvblFOYW1lKSkNCi0JCQl7DQotCQkJCUFubm90YXRpb25JbXBsPFQ+IHJlc3VsdCA9IG5ldyBBbm5vdGF0aW9uSW1wbDxUPihhbm5vdGF0aW9uUU5hbWUsIHRtcEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkpOw0KLQkJCQlyZXN1bHQuc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShpTWVtYmVyKTsNCi0JCQkJcmVzdWx0LnNldExvY2F0b3IodG1wQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOwkJDQotCX0JDQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGJvb2xlYW4gY2hlY2tTcGVjaWZpY0Fubm90YXR0aW9uKGZpbmFsIEFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb24sIGZpbmFsIElUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uUU5hbWUpIHx8IA0KLQkJCQkodHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpICsgIi4iICsgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKS5lcXVhbHMoYW5ub3RhdGlvblFOYW1lKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlJQ29tcGlsYXRpb25Vbml0IGNVbml0ID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCUlJbXBvcnREZWNsYXJhdGlvbltdIGltcG9ydHMgPSBjVW5pdC5nZXRJbXBvcnRzKCk7DQotCQlmb3IgKElJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsYXJhdGlvbiA6IGltcG9ydHMpDQotCQl7DQotCQkJaWYoYW5ub3RhdGlvblFOYW1lLmVuZHNXaXRoKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkgJiYgaW1wb3J0RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvblFOYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZm9yIChJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gOiBpbXBvcnRzKQ0KLQkJew0KLQkJCWlmKGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkuZW5kc1dpdGgoIioiKSkgLy8kTk9OLU5MUy0xJA0KLQkJCXsNCi0JCQkJU3RyaW5nIGltcG9ydFN0ciA9IGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkuc3Vic3RyaW5nKDAsIGltcG9ydERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgLSAxKTsNCi0JCQkJaWYoYW5ub3RhdGlvblFOYW1lLmVuZHNXaXRoKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkgJiYgYW5ub3RhdGlvblFOYW1lLmluZGV4T2YoaW1wb3J0U3RyKSA9PSAwKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIElWYWx1ZSBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJc3dpdGNoIChlbGVtZW50LmdldE5vZGVUeXBlKCkpDQotCQl7DQotCQkJY2FzZSBBU1ROb2RlLk1BUktFUl9BTk5PVEFUSU9OOg0KLQkJCXsNCi0JCQkJTWFya2VyQW5ub3RhdGlvbiBtYSA9IChNYXJrZXJBbm5vdGF0aW9uKSBlbGVtZW50Ow0KLQkJCQlBbm5vdGF0aW9uSW1wbCBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsKGdldEZ1bGx5UXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUobWEpLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOw0KLQkJCQlhbm5vdGF0aW9uLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihtYSkpOw0KLQkJCQlyZXR1cm4gYW5ub3RhdGlvbjsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTjoNCi0JCQl7DQotCQkJCWZpbmFsIFNpbmdsZU1lbWJlckFubm90YXRpb24gc21hID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGVsZW1lbnQ7DQotCQkJCWZpbmFsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0NCi0JCQkJZmluYWwgSVZhbHVlIHZhbHVlID0gY29udmVydEV4cHJlc3Npb24oc21hLmdldFZhbHVlKCkpOw0KLQkJCQlpZiAodmFsdWUhPW51bGwpIHsNCi0JCQkJCXZhbHVlcy5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgidmFsdWUiLCB2YWx1ZSkpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJDQotCQkJCUFubm90YXRpb25JbXBsIGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGwoZ2V0RnVsbHlRdWFsaWZpZWRBbm5vdGF0aW9uTmFtZShzbWEpLCB2YWx1ZXMpOw0KLQkJCQlhbm5vdGF0aW9uLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihzbWEpKTsNCi0JCQkJcmV0dXJuIGFubm90YXRpb247DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5OT1JNQUxfQU5OT1RBVElPTjoNCi0JCQl7DQotCQkJCXJldHVybiBnZXROb3JtYWxBbm5vdGF0aW9uVmFsdWUoKE5vcm1hbEFubm90YXRpb24pIGVsZW1lbnQpOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVI6DQotCQkJew0KLQkJCQlBcnJheUluaXRpYWxpemVyIGFyciA9IChBcnJheUluaXRpYWxpemVyKSBlbGVtZW50Ow0KLQkJCQlMaXN0PEV4cHJlc3Npb24+IGxpc3QgPSBhcnIuZXhwcmVzc2lvbnMoKTsNCi0JCQkJSXRlcmF0b3I8RXhwcmVzc2lvbj4gaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsNCi0JCQkJU2V0PElWYWx1ZT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQkJCXsNCi0JCQkJCUV4cHJlc3Npb24gZXhwciA9IChFeHByZXNzaW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJCXJlc3VsdC5hZGQoY29udmVydEV4cHJlc3Npb24oZXhwcikpOw0KLQkJCQl9DQotCQkJCXJldHVybiBuZXcgQXJyYXlWYWx1ZUltcGwocmVzdWx0KTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLk5VTExfTElURVJBTDoNCi0JCQl7DQotCQkJCS8vIHJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVOdWxsVmFsdWUoKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5TSU1QTEVfTkFNRToNCi0JCQl7DQotCQkJCWJyZWFrOy8vcmV0dXJuIG5ldyBTdHJpbmdWYWx1ZUltcGwoKChTaW1wbGVOYW1lKWVsZW1lbnQpLmdldElkZW50aWZpZXIoKSk7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5UWVBFX0xJVEVSQUw6DQotCQkJew0KLQkJCQlyZXR1cm4gZ2V0VHlwZUxpdGVyYWxWYWx1ZSgoVHlwZUxpdGVyYWwpIGVsZW1lbnQpOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuUVVBTElGSUVEX05BTUU6DQotCQkJew0KLQkJCQlRdWFsaWZpZWROYW1lIHFuID0gKFF1YWxpZmllZE5hbWUpIGVsZW1lbnQ7DQotCQkJCVF1YWxpZmllZE5hbWVWYWx1ZUltcGwgcW5WYWx1ZSA9IG5ldyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsKHFuLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCQkJcW5WYWx1ZS5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IocW4pKTsNCi0JCQkJcmV0dXJuIHFuVmFsdWU7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5CT09MRUFOX0xJVEVSQUw6DQotCQkJew0KLQkJCQlCb29sZWFuTGl0ZXJhbCBibCA9IChCb29sZWFuTGl0ZXJhbCkgZWxlbWVudDsNCi0JCQkJQm9vbGVhblZhbHVlSW1wbCBiVmFsdWUgPSBuZXcgQm9vbGVhblZhbHVlSW1wbChibC5ib29sZWFuVmFsdWUoKSk7DQotCQkJCWJWYWx1ZS5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IoYmwpKTsNCi0JCQkJcmV0dXJuIGJWYWx1ZTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLkNIQVJBQ1RFUl9MSVRFUkFMOg0KLQkJCXsNCi0JCQkJLy8gQ2hhcmFjdGVyTGl0ZXJhbCBjbCA9IChDaGFyYWN0ZXJMaXRlcmFsKSBlbGVtZW50Ow0KLQkJCQkvLyBUT0RPIEZpbmlzaCB3aXRoIHRoaXMgcmV0dXJuIG5ldyBDaGFyYWN0ZXJWYWx1ZShjbC5jaGFyVmFsdWUoKSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuTlVNQkVSX0xJVEVSQUw6DQotCQkJew0KLQkJCQlOdW1iZXJMaXRlcmFsIG5sID0gKE51bWJlckxpdGVyYWwpIGVsZW1lbnQ7DQotCQkJCUludGVnZXJWYWx1ZUltcGwgaW50VmFsdWUgPSBuZXcgSW50ZWdlclZhbHVlSW1wbChubC5nZXRUb2tlbigpKTsNCi0JCQkJaW50VmFsdWUuc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKG5sKSk7DQotCQkJCXJldHVybiBpbnRWYWx1ZTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLlNUUklOR19MSVRFUkFMOg0KLQkJCXsNCi0JCQkJU3RyaW5nTGl0ZXJhbCBzbCA9IChTdHJpbmdMaXRlcmFsKSBlbGVtZW50Ow0KLQkJCQlTdHJpbmdWYWx1ZUltcGwgc3RyVmFsdWUgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKHNsLmdldExpdGVyYWxWYWx1ZSgpKTsNCi0JCQkJc3RyVmFsdWUuc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKHNsKSk7DQotCQkJCXJldHVybiBzdHJWYWx1ZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJVmFsdWUgZ2V0VHlwZUxpdGVyYWxWYWx1ZShUeXBlTGl0ZXJhbCB0bCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlUeXBlIHR5cGUgPSB0bC5nZXRUeXBlKCk7DQotCQlOYW1lIG5hbWUgPSBudWxsOw0KLQkJaWYgKHR5cGUuaXNRdWFsaWZpZWRUeXBlKCkpDQotCQl7DQotCQkJbmFtZSA9ICgoUXVhbGlmaWVkVHlwZSkgdHlwZSkuZ2V0TmFtZSgpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJaWYgKHR5cGUuaXNTaW1wbGVUeXBlKCkpDQotCQkJew0KLQkJCQluYW1lID0gKChTaW1wbGVUeXBlKSB0eXBlKS5nZXROYW1lKCk7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKG5hbWUgIT0gbnVsbCkNCi0JCXsNCi0JCQlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQodGwpOw0KLQkJCWlmIChjdSAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IG5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotCQkJCWlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKQ0KLQkJCQl7DQotCQkJCQlmdWxseVF1YWxpZmllZE5hbWUgPSByZXNvbHZlVHlwZSgoSUNvbXBpbGF0aW9uVW5pdCkgY3UuZ2V0SmF2YUVsZW1lbnQoKSwgZnVsbHlRdWFsaWZpZWROYW1lKTsNCi0JCQkJfQ0KLQ0KLQkJCQlDbGFzc1ZhbHVlSW1wbCBjVmFsdWUgPSBuZXcgQ2xhc3NWYWx1ZUltcGwoZnVsbHlRdWFsaWZpZWROYW1lKTsNCi0JCQkJY1ZhbHVlLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcih0bCkpOw0KLQkJCQlyZXR1cm4gY1ZhbHVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBJVmFsdWUgZ2V0Tm9ybWFsQW5ub3RhdGlvblZhbHVlKE5vcm1hbEFubm90YXRpb24gbmEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGwgPSBuYS52YWx1ZXMoKTsNCi0JCUl0ZXJhdG9yPE1lbWJlclZhbHVlUGFpcj4gaXRlciA9IGwuaXRlcmF0b3IoKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlNZW1iZXJWYWx1ZVBhaXIgbXZwID0gKE1lbWJlclZhbHVlUGFpcikgaXRlci5uZXh0KCk7DQotCQkJSVZhbHVlIG12cHZhbCA9IGNvbnZlcnRFeHByZXNzaW9uKG12cC5nZXRWYWx1ZSgpKTsNCi0JCQlQYXJhbVZhbHVlUGFpckltcGwgcGFpciA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwobXZwLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCksIG12cHZhbCk7DQotCQkJcGFpci5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IobXZwKSk7DQotCQkJcmVzdWx0LmFkZChwYWlyKTsNCi0JCX0NCi0JCQ0KLQkJQW5ub3RhdGlvbkltcGwgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbChnZXRGdWxseVF1YWxpZmllZEFubm90YXRpb25OYW1lKG5hKSwgcmVzdWx0KTsNCi0JCWFubm90YXRpb24uc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKG5hKSk7DQotCQlyZXR1cm4gYW5ub3RhdGlvbjsNCi0JfQkNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRBbm5vdGF0aW9uTmFtZShBbm5vdGF0aW9uIGFubm8pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJTmFtZSB0eXBlTmFtZSA9IGFubm8uZ2V0VHlwZU5hbWUoKTsNCi0JCVN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSB0eXBlTmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0JCWlmICh0eXBlTmFtZS5pc1NpbXBsZU5hbWUoKSkNCi0JCXsNCi0JCQlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoYW5ubyk7DQotCQkJZnVsbHlRdWFsaWZpZWROYW1lID0gcmVzb2x2ZVR5cGUoKElDb21waWxhdGlvblVuaXQpIGN1LmdldEphdmFFbGVtZW50KCksIGZ1bGx5UXVhbGlmaWVkTmFtZSk7DQotCQl9DQotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWROYW1lOw0KLQl9DQotCQ0KLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoRXhwcmVzc2lvbiBlbGVtZW50KQ0KLQl7DQotCQlBU1ROb2RlIGN1ID0gZWxlbWVudDsNCi0JCXdoaWxlIChjdSAhPSBudWxsICYmICEoY3UgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpKQ0KLQkJew0KLQkJCWN1ID0gY3UuZ2V0UGFyZW50KCk7DQotCQl9DQotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgY3U7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVUeXBlKElDb21waWxhdGlvblVuaXQgaWN1LCBTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyBsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZ1bGx5UXVhbGlmaWVkTmFtZTsNCi0JCUlUeXBlW10gYWxsVHlwZXMgPSBpY3UuZ2V0QWxsVHlwZXMoKTsNCi0JCWlmIChhbGxUeXBlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZTsNCi0JCX0NCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsVHlwZXMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJU3RyaW5nW11bXSByZXNvbHZlZFR5cGUgPSBhbGxUeXBlc1tpXS5yZXNvbHZlVHlwZShsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZSk7DQotCQkJaWYgKHJlc29sdmVkVHlwZSAhPSBudWxsICYmIHJlc29sdmVkVHlwZS5sZW5ndGggPiAwKQ0KLQkJCXsNCi0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZXNvbHZlZFR5cGVbMF0ubGVuZ3RoOyBqKyspDQotCQkJCXsNCi0JCQkJCWJ1ZiA9IGFwcGVuZERvdChqLCBidWYpOw0KLQkJCQkJYnVmLmFwcGVuZChyZXNvbHZlZFR5cGVbMF1bal0pOw0KLQkJCQl9DQotCQkJCWxvY2FsRnVsbHlRdWFsaWZpZWROYW1lID0gYnVmLnRvU3RyaW5nKCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBsb2NhbEZ1bGx5UXVhbGlmaWVkTmFtZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYXBwZW5kRG90KGludCBpbmRleCwgU3RyaW5nQnVmZmVyIGJ1ZmYpDQotCXsNCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBidWZmOw0KLQkJaWYgKGluZGV4ICE9IDApDQotCQl7DQotCQkJcmVzdWx0LmFwcGVuZCgnLicpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBJQW5ub3RhdGlvbjxUPiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKGZpbmFsIFQgdHlwZSwgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIWlzU3VwcG9ydGVkSmF2YUVsZW1lbnQodHlwZSkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFzc2VkIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUuIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCA9IG51bGw7DQotCQlpZiAodHlwZSBpbnN0YW5jZW9mIElNZW1iZXIpIHsNCi0JCQljVW5pdCA9ICgoSU1lbWJlcil0eXBlKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWNVbml0ID0gKChJVHlwZVBhcmFtZXRlcil0eXBlKS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGNVbml0ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCWZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlmaW5hbCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIHVuaXQpOw0KLQkJDQotCQlzd2l0Y2godHlwZS5nZXRFbGVtZW50VHlwZSgpKQ0KLQkJew0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToNCi0JCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uKHR5cGUsIHR5cGVEZWNsYXJhdGlvbiwgKElUeXBlKXR5cGUsIGFubm90YXRpb25RTmFtZSk7DQotCQkNCi0JCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEOg0KLQkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpIHR5cGU7DQotCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWVsZERlY2xhcmF0aW9uKGZpZWxkLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbih0eXBlLCBmaWVsZERlY2xhcmF0aW9uLCBmaWVsZC5nZXREZWNsYXJpbmdUeXBlKCksIGFubm90YXRpb25RTmFtZSk7DQotDQotCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6DQotCQkJSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgdHlwZTsNCi0JCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbih0eXBlLCBtZXRob2REZWNsYXJhdGlvbiwgbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSwgYW5ub3RhdGlvblFOYW1lKTsNCi0NCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOg0KLQkJCW1ldGhvZCA9IChJTWV0aG9kKSgoSVR5cGVQYXJhbWV0ZXIpIHR5cGUpLmdldFBhcmVudCgpOw0KLQkJCW1ldGhvZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QsIChUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKTsNCi0JCQlyZXR1cm4gZ2V0U3BlY2lmaWNQYXJhbUFubm90YXRpb24odHlwZSwgbWV0aG9kRGVjbGFyYXRpb24sIG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCksIGFubm90YXRpb25RTmFtZSk7DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGdldFNwZWNpZmljQW5ub3RhdGlvbihmaW5hbCBUIGlNZW1iZXIsIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24sIGZpbmFsIElUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKGJvZHlEZWNsYXJhdGlvbiAhPSBudWxsKQ0KLQkJew0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQkJCWZpbmFsIExpc3QgbGlzdCA9IGJvZHlEZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsNCi0JCQlyZXR1cm4gZXh0cmFjdFNwZWNpZmljQW5ub3RhdGlvbihpTWVtYmVyLCBsaXN0LCB0eXBlLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGdldFNwZWNpZmljUGFyYW1Bbm5vdGF0aW9uKFQgaU1lbWJlciwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIGZpbmFsIElUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKG1ldGhvZERlY2xhcmF0aW9uICE9IG51bGwpDQotCQl7DQotCQkJZm9yIChPYmplY3QgcGFyYW0gOiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkpDQotCQkJew0KLQkJCQlpZiAocGFyYW0gaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uICYmDQotCQkJCQkJKChJVHlwZVBhcmFtZXRlcilpTWVtYmVyKS5nZXRFbGVtZW50TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbilwYXJhbSkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKQ0KLQkJCQl7DQotCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JCQkJCWZpbmFsIExpc3QgbGlzdCA9ICgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyYW0pLm1vZGlmaWVycygpOw0KLQkJCQkNCi0JCQkJCXJldHVybiBleHRyYWN0U3BlY2lmaWNBbm5vdGF0aW9uKGlNZW1iZXIsIGxpc3QsIHR5cGUsIGFubm90YXRpb25RTmFtZSk7DQotCQkJCX0NCi0JCQl9CQkJDQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0JDQotCXByaXZhdGUgYm9vbGVhbiBpc1N1cHBvcnRlZEphdmFFbGVtZW50KGZpbmFsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgDQotCXsNCi0JCXJldHVybiAJamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKT09SUphdmFFbGVtZW50Lk1FVEhPRCB8fA0KLQkJCQlqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpPT1JSmF2YUVsZW1lbnQuVFlQRSB8fA0KLQkJCQlqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpPT1JSmF2YUVsZW1lbnQuRklFTEQgfHwNCi0JCQkJamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKT09SUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOw0KLQl9DQotCQ0KLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSANCi0Jew0KLQkJaWYgKGNVbml0PT1udWxsKSB7DQotCQkJY1VuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbnVsbCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjVW5pdDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9jYXRvciBjcmVhdGVMb2NhdG9yKGZpbmFsIEFTVE5vZGUgbm9kZSkNCi0Jew0KLQkJZmluYWwgaW50IGxpbmVOdW1iZXIgPSBnZXRDb21waWxhdGlvblVuaXQoKS5nZXRMaW5lTnVtYmVyKG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCXJldHVybiBuZXcgTG9jYXRvckltcGwobGluZU51bWJlciwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCksIG5vZGUuZ2V0TGVuZ3RoKCkpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2MxN2JmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25Qcm9wZXJ0eTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblByb3BlcnR5IGltcGxlbWVudHMgSUFubm90YXRpb25Qcm9wZXJ0eQ0KLXsNCi0JcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbk5hbWU7DQotCXByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQlwcml2YXRlIEF0dHJpYnV0ZVR5cGVFbnVtIGF0dHJpYnV0ZVR5cGU7DQotCQ0KLQkvKioNCi0JICogUHVibGljIGNvbnN0cnVjdG9yIGZvciBBbm5vdGF0aW9uUHJvcGVydHkgb2JqZWN0cw0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lIC0gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBOYW1lIGZvciB0aGUgQW5ub3RhdGlvbi4NCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE5hbWUgZm9yIHRoZSBBdHRyaWJ1dGUuDQotCSAqIEBwYXJhbSB2YWx1ZSAtIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVmFsdWUgZm9yIHRoZSBBdHRyaWJ1dGUuDQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvblByb3BlcnR5KGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSwgZmluYWwgQXR0cmlidXRlVHlwZUVudW0gYXR0cmlidXRlVHlwZSkNCi0Jew0KLQkJdGhpcy5hbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb25OYW1lOw0KLQkJdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JCXRoaXMuYXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7DQotCX0NCi0JCQ0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbk5hbWU7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZTsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpDQotCXsNCi0JCXJldHVybiB0aGlzLnZhbHVlOw0KLQl9DQotCQ0KLQlwdWJsaWMgQXR0cmlidXRlVHlwZUVudW0gZ2V0QXR0cmlidXRlVHlwZSgpDQotCXsNCi0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZVR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YjAxOGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyDQotew0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiB0eXBlQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSANCi0JCW5ldyBIYXNoTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+KCk7DQotCXByaXZhdGUgTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+IG1ldGhvZEFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gDQotCQluZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PigpOw0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiBwYXJhbWV0ZXJBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IA0KLQkJbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4oKTsNCi0JDQotCS8qKg0KLQkgKiBBZGQgQW5ub3RhdGlvbiBQcm9wZXJ0eSB0byB0aGUgY29udGFpbmVyLiANCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4gb3IgPGNvZGU+YW5ub3RhdGlvblByb3BlcnR5PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZEFubm90YXRpb25Qcm9wZXJ0eShmaW5hbCBBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5LCBmaW5hbCBFbGVtZW50VHlwZSB0YXJnZXQpDQotCXsNCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYW5ub3RhdGlvblByb3BlcnR5IGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZih0YXJnZXQgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRhcmdldCBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYoISh0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlRZUEUpKSAmJiAhKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuTUVUSE9EKSkgJiYgISh0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlBBUkFNRVRFUikpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRhcmdldCBwYXJhbWV0ZXIgaXMgbm90IG9mIGNvcnJlY3QgdHlwZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4gYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBudWxsOw0KLQkJDQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlRZUEUpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gdHlwZUFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwOw0KLQkJfQ0KLQkJaWYodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5NRVRIT0QpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gbWV0aG9kQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXA7DQotCQl9DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlBBUkFNRVRFUikpDQotCQl7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBwYXJhbWV0ZXJBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcDsNCi0JCX0NCi0JCQ0KLQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlc1NldCA9IGFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwLmdldChhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlpZihwYXJhbVZhbHVlc1NldCA9PSBudWxsKQ0KLQkJew0KLQkJCXBhcmFtVmFsdWVzU2V0ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwLnB1dChhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QW5ub3RhdGlvbk5hbWUoKSwgcGFyYW1WYWx1ZXNTZXQpOw0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHZhbHVlID0gbnVsbDsgDQotCQlpZihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlVHlwZSgpID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlpZihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlVHlwZSgpLmVxdWFscyhBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKSkNCi0JCXsNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZShuZXcgQm9vbGVhbihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0VmFsdWUoKSkpOw0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblByb3BlcnR5LmdldEF0dHJpYnV0ZVR5cGUoKS5lcXVhbHMoQXR0cmlidXRlVHlwZUVudW0uQ0xBU1MpKQ0KLQkJew0KLQkJCS8vVE9ETyBjaGFuZ2UgdGhpcyEhISEhIQ0KLQkJCS8vdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVDbGFzc1ZhbHVlKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSgpKTsNCi0JCX0NCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpKQ0KLQkJew0KLQkJCXZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlSW50ZWdlclZhbHVlKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSgpKTsNCi0JCX0NCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKSkNCi0JCXsNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShhbm5vdGF0aW9uUHJvcGVydHkuZ2V0VmFsdWUoKSk7DQotCQl9DQotCQlpZih2YWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoYW5ub3RhdGlvblByb3BlcnR5LmdldFZhbHVlKCkpOw0KLQkJfQ0KLQ0KLQkJSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlTmFtZSgpLCB2YWx1ZSk7DQotCQkNCi0JCXBhcmFtVmFsdWVzU2V0LmFkZChwYXJhbVZhbHVlUGFpcik7DQotCX0NCi0JLyoqDQotCSAqIEBwYXJhbSBJVHlwZVBhcmFtZXRlciANCi0JICogQHJldHVybiBTZXQgd2l0aCBhbGwgQW5ub3RhdGlvbiBmcm9tIHRoZSBjb250YWluZXIsIHdoaWNoIGFyZSBJVHlwZVBhcmFtZXRlciByZWxldmFudC4NCi0JICovDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBnZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhJVHlwZVBhcmFtZXRlciB0UGFyYW0pDQotCXsNCi0JCXJldHVybiBnZXRBbm5vdGF0aW9ucyhFbGVtZW50VHlwZS5QQVJBTUVURVIsIHRQYXJhbSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gU2V0IHdpdGggYWxsIEFubm90YXRpb24gZnJvbSB0aGUgY29udGFpbmVyLCB3aGljaCBhcmUgSVR5cGUgcmVsZXZhbnQuDQotCSAqLw0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uPElUeXBlPj4gZ2V0VHlwZUFubm90YXRpb25zKElUeXBlIHR5cGUpDQotCXsNCi0JCXJldHVybiBnZXRBbm5vdGF0aW9ucyhFbGVtZW50VHlwZS5UWVBFLCB0eXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiBTZXQgd2l0aCBhbGwgQW5ub3RhdGlvbiBmcm9tIHRoZSBjb250YWluZXIsIHdoaWNoIGFyZSBJTWV0aG9kIHJlbGV2YW50Lg0KLQkgKi8NCi0JcHVibGljIFNldDxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gZ2V0TWV0aG9kQW5ub3RhdGlvbnMoSU1ldGhvZCBtZXRob2QpDQotCXsNCi0JCXJldHVybiBnZXRBbm5vdGF0aW9ucyhFbGVtZW50VHlwZS5NRVRIT0QgLCBtZXRob2QpOw0KLQl9DQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBTZXQ8SUFubm90YXRpb248VD4+IGdldEFubm90YXRpb25zKGZpbmFsIEVsZW1lbnRUeXBlIHRhcmdldCwgZmluYWwgVCBpVGFyZ2V0KQ0KLQl7DQotCQlpZighKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuVFlQRSkpICYmICEodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5NRVRIT0QpKSAmJiAhKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuUEFSQU1FVEVSKSkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGFyZ2V0IHBhcmFtZXRlciBpcyBub3Qgb2YgY29ycmVjdCB0eXBlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCU1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiBhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IG51bGw7DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlRZUEUpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gdHlwZUFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwOw0KLQkJfQ0KLQkJaWYodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5NRVRIT0QpKQ0KLQkJew0KLQkJCWFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gbWV0aG9kQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXA7DQotCQl9DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLlBBUkFNRVRFUikpDQotCQl7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBwYXJhbWV0ZXJBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcDsNCi0JCX0NCi0JCVNldDxJQW5ub3RhdGlvbjxUPj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCQlTZXQ8U3RyaW5nPiBrZXlzID0gYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAua2V5U2V0KCk7DQotCQlmb3IgKFN0cmluZyBrZXkgOiBrZXlzKQ0KLQkJew0KLQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlyc1NldCA9IGFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwLmdldChrZXkpOw0KLQkJCUlBbm5vdGF0aW9uPFQ+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKGtleSwgcGFyYW1WYWx1ZVBhaXJzU2V0LCBpVGFyZ2V0KTsNCi0JCQlyZXN1bHQuYWRkKGFubm90YXRpb24pOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4NTVhMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRWRpdFJlc291cmNlc01hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLklGaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsNCi0NCi0vKioNCi0gKiBDb250YWlucyB1dGlsaXRpZXMgZm9yIGdldHRpbmcgQVNUIG9iamVjdHMgbmVlZGVkIGluIGFubm90YXRpb24gcHJvY2Vzc2luZw0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVXRpbHMNCi17DQotCXByaXZhdGUgc3RhdGljIEFubm90YXRpb25VdGlscyB1dGlscyA9IG51bGw7DQotCXByaXZhdGUgZmluYWwgSUZpbGVVdGlscyBmaWxlVXRpbHMgPSBGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmYWN0b3J5IG1ldGhvZC4NCi0JICogDQotCSAqIEByZXR1cm4gYSBBbm5vdGF0aW9uVXRpbHMgaW5zdGFuY2UuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25VdGlscyBnZXRJbnN0YW5jZSgpDQotCXsNCi0JCWlmICh1dGlscyA9PSBudWxsKQ0KLQkJew0KLQkJCXV0aWxzID0gbmV3IEFubm90YXRpb25VdGlscygpOw0KLQkJfQ0KLQkJcmV0dXJuIHV0aWxzOw0KLQl9DQotCQ0KLQkvKioNCi0JICogR2V0cyBJRG9jdW1lbnQsIHdoaWNoIGNvcmVzcG9uZHMgdG8gb25lIENvbXBpbGF0aW9uVW5pdC4NCi0JICogDQotCSAqIEBwYXJhbSB1bml0IC0NCi0JICogICAgICAgICAgICBDb21waWxhdGlvbiBVbml0LCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc3RhcnRpbmcgcG9pbnQgdG8gZ2V0IHRoZSBJRG9jdW1lbnQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIElEb2N1bWVudCB3aGljaCBpcyBmb3VuZC4NCi0JICogDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudChJQ29tcGlsYXRpb25Vbml0IHVuaXQpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyBzb3VyY2UgPSB1bml0LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7IA0KLQkJcmV0dXJuIG5ldyBEb2N1bWVudChzb3VyY2UpOyANCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgQW5ub3RhdGlvbnMgb2Ygc3BlY2lmaWVkIElKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudCAtIElKYXZhRWxlbWVudCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc3RhcnRpbmcgcG9pbiBmb3IgcmVtb3ZpbmcgdGhlIGFubm90YXRpb25zLg0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnMgLSBTZXQgd2hpY2ggY29udGFpbnMgU3RyaW5nIHZhbHVlcyBmb3IgdGhlIGFubm90YXRpb25zIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZC4gSWYgdGhpcyBTZXQgaXMgZW1wdHkgYWxsIEFubm90YXRpb25zIHdpbGwgYmUgcmVtb3ZlZC4NCi0JICogQHBhcmFtIGRlZXBSZW1vdmUgLSBCb29sZWFuIHZhbHVlLCByZXByZXNlbnRpbmcgd2hldGhlciBBbm5vdGF0aW9ucyBmcm9tIGphdmFFbGVtZXQgY2hpbGRzIHdpbGwgYmUgcmVtb3ZlZC4gDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiANCi0JICogDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB0aG93biBpZiBBU1QgVHlwZURlY2xhcmF0aW9uIGNhbm5vdCBiZSBmb3VuZCBmb3IgPGNvZGU+dHlwZTwvY29kZT4gYW5kIGFsc28gaXMgdXNlZCBhcyB3cmFwcGVyIGluIGNhc2Uge0BsaW5rIENvcmVFeGNlcHRpb259IG9yDQotCSAqICAgICAgICAgICAgIHtAbGluayBCYWRMb2NhdGlvbkV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoaWxlIHByb2Nlc3NpbmcuDQotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb25zKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gZGVlcFJlbW92ZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24NCi0Jew0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkNCi0JCXsNCi0JCQlJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50Ow0KLQkJCUlDb21waWxhdGlvblVuaXQgY1VuaXQgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjVW5pdCwgbnVsbCk7DQotDQotCQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCB1bml0KTsNCi0JCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpDQotCQkJew0KLQkJCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbigidHlwZURlY2xhcmF0aW9uIHNob3VsZCBub3QgYmUgbnVsbCIsLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKYXhXc1V0aWxNZXNzYWdlcy5Bbm5vdGF0aW9uVXRpbHNfUGFyYW1TaG91bGROb3RCZU51bGxNc2csICJ0eXBlRGVjbGFyYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQkJDQotCQkJcmVtb3ZlVHlwZUFubm90YXRpb25zKHR5cGUsIHR5cGVEZWNsYXJhdGlvbiwgdW5pdCwgY1VuaXQsIGFubm90YXRpb25zKTsNCi0NCi0JCQlpZighZGVlcFJlbW92ZSkNCi0JCQl7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJSUZpZWxkW10gdG1wRmllbGRzID0gdHlwZS5nZXRGaWVsZHMoKTsNCi0JCQlpZiAodG1wRmllbGRzICE9IG51bGwgJiYgdG1wRmllbGRzLmxlbmd0aCA+IDApDQotCQkJew0KLQkJCQlmb3IgKElGaWVsZCB0bXBGaWVsZCA6IHRtcEZpZWxkcykNCi0JCQkJew0KLQkJCQkJcmVtb3ZlRmllbGRBbm5vdGF0aW9ucyh0bXBGaWVsZCwgdHlwZSwgY1VuaXQsIGFubm90YXRpb25zKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlJTWV0aG9kW10gdG1wTWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOw0KLQkJCWlmICh0bXBNZXRob2RzICE9IG51bGwgJiYgdG1wTWV0aG9kcy5sZW5ndGggPiAwKQ0KLQkJCXsNCi0JCQkJZm9yIChJTWV0aG9kIHRtcE1ldGhvZCA6IHRtcE1ldGhvZHMpDQotCQkJCXsNCi0JCQkJCXJlbW92ZU1ldGhvZEFubm90YXRpb25zKHRtcE1ldGhvZCwgdHlwZSwgY1VuaXQsIGFubm90YXRpb25zKTsNCi0NCi0JCQkJCS8vUmVtb3ZlIHBhcmFtcyBhbm5vdGF0aW9ucw0KLQkJCQkJZm9yIChTdHJpbmcgcGFyYW1OYW1lIDogdG1wTWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCkpDQotCQkJCQl7DQotCQkJCQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IHRtcE1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHBhcmFtTmFtZSk7DQotCQkJCQkJcmVtb3ZlUGFyYW1Bbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLCB0eXBlLCBjVW5pdCwgYW5ub3RhdGlvbnMsIHBhcmFtTmFtZSk7CQkJDQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKQ0KLQkJew0KLQkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpamF2YUVsZW1lbnQ7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGZpZWxkLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJDQotCQkJcmVtb3ZlRmllbGRBbm5vdGF0aW9ucyhmaWVsZCwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9ucyk7DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkNCi0JCXsNCi0JCQlJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKWphdmFFbGVtZW50Ow0KLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJCUlDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0ID0gZGVjbGFyaW5nVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkNCi0JCQlyZW1vdmVNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QsIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbnMpOw0KLQkJCWlmKCFkZWVwUmVtb3ZlKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0NCi0JCQkvL1JlbW92ZSBwYXJhbXMgYW5ub3RhdGlvbnMNCi0JCQlmb3IgKFN0cmluZyBwYXJhbU5hbWU6IG1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpKQ0KLQkJCXsNCi0JCQkgIElUeXBlUGFyYW1ldGVyIHBhcmFtID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIocGFyYW1OYW1lKTsNCi0JCQkgIHJlbW92ZVBhcmFtQW5ub3RhdGlvbnMocGFyYW0sIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbnMsIHBhcmFtTmFtZSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKQ0KLQkJew0KLQkJCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSAoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQ7DQotCQkJSU1ldGhvZCB0bXBNZXRob2QgPSAoSU1ldGhvZCkgdHlwZVBhcmFtZXRlci5nZXREZWNsYXJpbmdNZW1iZXIoKTsNCi0JCQkvL1RPRE8gY2hlY2sgdGhpcw0KLQkJCS8vcGFyYW0uZ2V0UGFyZW50KCk7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IHRtcE1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQgPSBkZWNsYXJpbmdUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCS8vVE9ETyBGSVggVEhJUw0KLQkJCXJlbW92ZVBhcmFtQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlciwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9ucywgbnVsbCk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZW1vdmVUeXBlQW5ub3RhdGlvbnMoSVR5cGUgdHlwZSwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBDb21waWxhdGlvblVuaXQgdW5pdCwgSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb25zKHR5cGVEZWNsYXJhdGlvbi5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbnNTZXQpKQ0KLQkJew0KLQkJCUlEb2N1bWVudCBkb2MgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXREb2N1bWVudChjVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IHVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChjVW5pdCwgZG9jKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRmllbGRBbm5vdGF0aW9ucyhJRmllbGQgZmllbGQsIElUeXBlIGRlY2xhcmluZ1R5cGUsIElDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uc1NldCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSUNvbXBpbGF0aW9uVW5pdCBmY1VuaXQgPSBmaWVsZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgZlVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIGZCb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIGZVbml0KTsNCi0JCWZCb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oZmllbGQsIChUeXBlRGVjbGFyYXRpb24pIGZCb2R5RGVjbGFyYXRpb24pOw0KLQ0KLQkJZlVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb25zKGZCb2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCksIGFubm90YXRpb25zU2V0KSkNCi0JCXsNCi0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gZlVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGRvYyk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1ldGhvZEFubm90YXRpb25zKElNZXRob2QgbWV0aG9kLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlDb21waWxhdGlvblVuaXQgbWNVbml0ID0gbWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBtVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG1jVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgbVVuaXQpOw0KLQkJbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKTsNCi0JCW1Vbml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCWlmIChyZW1vdmVBbm5vdGF0aW9ucyhtQm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uc1NldCkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IG1Vbml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVQYXJhbUFubm90YXRpb25zKElUeXBlUGFyYW1ldGVyIHBhcmFtLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnNTZXQsIFN0cmluZyBwYXJhbU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlNZXRob2QgdG1wTWV0aG9kID0gKElNZXRob2QpcGFyYW0uZ2V0RGVjbGFyaW5nTWVtYmVyKCk7DQotCQkvL1RPRE8gY2hlY2sgdGhpcw0KLQkJLy9wYXJhbS5nZXRQYXJlbnQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlJQ29tcGlsYXRpb25Vbml0IG1jVW5pdCA9IHRtcE1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBtVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG1jVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgbVVuaXQpOw0KLQkJbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24odG1wTWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKTsNCi0JCW1Vbml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0NCi0JCWZvciAoT2JqZWN0IG9iamVjdCA6ICgoTWV0aG9kRGVjbGFyYXRpb24pIG1Cb2R5RGVjbGFyYXRpb24pLnBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikNCi0JCQl7DQotCQkJICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHN2ZCA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBvYmplY3Q7DQotCQkJCWlmICgocGFyYW1OYW1lID09IG51bGwgfHwgc3ZkLmdldE5hbWUoKS50b1N0cmluZygpLmVxdWFscyhwYXJhbU5hbWUpKSAmJg0KLQkJCQkgICAgICAgIHJlbW92ZUFubm90YXRpb25zKHN2ZC5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbnNTZXQpKQ0KLQkJCQl7DQotCQkJCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQkJCVRleHRFZGl0IGVkaXQgPSBtVW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJCQllZGl0LmFwcGx5KGRvYyk7DQotCQkJCQkNCi0JCQkJCXNhdmVDb250ZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgZG9jKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHNhdmVDb250ZW50KElDb21waWxhdGlvblVuaXQgY1VuaXQsIElEb2N1bWVudCBkb2MpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJU3RhdHVzIHN0YXR1cyA9IChuZXcgRWRpdFJlc291cmNlc01hbmFnZXIoKSkuc2V0RmlsZUVkaXRhYmxlKChJRmlsZSkgY1VuaXQuZ2V0UmVzb3VyY2UoKSk7DQotCQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LICkNCi0JCXsNCi0JCQlmaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoY1VuaXQsIGRvYy5nZXQoKSwgdHJ1ZSwgbnVsbCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oIkFubm90YXR0aW9uIGNvdWxkIG5vdCBiZSBzdG9yZWQsIHRoZSBmaWxlIGlzIG5vdCB3cml0YWJsZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCUpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25DYW5ub3RCZVN0b3JlZE1zZyk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIHNwZWNpZmljIEFubm90YXRpb24gb2Ygc3BlY2lmaWVkIElKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudCAtIElKYXZhRWxlbWVudCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgc3RhcnRpbmcgcG9pbiBmb3IgcmVtb3ZpbmcgdGhlIEFubm90YXRpb24uDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSAtIFN0cmluZyB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24gTmFtZSBvZiB0aGUgQW5ub3RhdGlvbiwgd2hpY2ggd2lsbCBiZSByZW1vdmVkLg0KLQkgKiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgdGhvd24gaWYgQVNUIFR5cGVEZWNsYXJhdGlvbiBjYW5ub3QgYmUgZm91bmQgZm9yIDxjb2RlPnR5cGU8L2NvZGU+IGFuZCBhbHNvIGlzIHVzZWQgYXMgd3JhcHBlciBpbiBjYXNlIHtAbGluayBDb3JlRXhjZXB0aW9ufSBvcg0KLQkgKiAgICAgICAgICAgICB7QGxpbmsgQmFkTG9jYXRpb25FeGNlcHRpb259IGlzIHRocm93biB3aGlsZSBwcm9jZXNzaW5nLg0KLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbg0KLQl7DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKQ0KLQkJew0KLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQ7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGNVbml0LCBudWxsKTsNCi0NCi0JCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIHVuaXQpOw0KLQkJCWlmICh0eXBlRGVjbGFyYXRpb24gPT0gbnVsbCkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKCJ0eXBlRGVjbGFyYXRpb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25VdGlsc19QYXJhbVNob3VsZE5vdEJlTnVsbE1zZywgInR5cGVEZWNsYXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQkNCi0JCQlyZW1vdmVUeXBlQW5ub3RhdGlvbih0eXBlLCB0eXBlRGVjbGFyYXRpb24sIHVuaXQsIGNVbml0LCBhbm5vdGF0aW9uTmFtZSk7DQotDQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKQ0KLQkJew0KLQkJCUlGaWVsZCBmaWVsZCA9IChJRmllbGQpamF2YUVsZW1lbnQ7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IGZpZWxkLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJDQotCQkJcmVtb3ZlRmllbGRBbm5vdGF0aW9uKGZpZWxkLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25OYW1lKTsNCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKQ0KLQkJew0KLQkJCUlNZXRob2QgbWV0aG9kID0gKElNZXRob2QpamF2YUVsZW1lbnQ7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQgPSBkZWNsYXJpbmdUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCQ0KLQkJCXJlbW92ZU1ldGhvZEFubm90YXRpb24obWV0aG9kLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25OYW1lKTsNCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikNCi0JCXsNCi0JCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50Ow0KLQkJCUlNZXRob2QgdG1wTWV0aG9kID0gKElNZXRob2QpIHR5cGVQYXJhbWV0ZXIuZ2V0RGVjbGFyaW5nTWVtYmVyKCk7DQotCQkJLy9UT0RPIGNoZWNrIHRoaXMNCi0JCQkvL3BhcmFtLmdldFBhcmVudCgpOw0KLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSB0bXBNZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJCUlDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0ID0gZGVjbGFyaW5nVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0NCi0JCQlyZW1vdmVQYXJhbUFubm90YXRpb24odHlwZVBhcmFtZXRlciwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9uTmFtZSk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZW1vdmVUeXBlQW5ub3RhdGlvbihJVHlwZSB0eXBlLCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENvbXBpbGF0aW9uVW5pdCB1bml0LCBJQ29tcGlsYXRpb25Vbml0IGNVbml0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uTmFtZSkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IEFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLmdldERvY3VtZW50KGNVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gdW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCXNhdmVDb250ZW50KGNVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVGaWVsZEFubm90YXRpb24oSUZpZWxkIGZpZWxkLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJQ29tcGlsYXRpb25Vbml0IGZjVW5pdCA9IGZpZWxkLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBmVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZjVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gZkJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgZlVuaXQpOw0KLQkJZkJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmllbGREZWNsYXJhdGlvbihmaWVsZCwgKFR5cGVEZWNsYXJhdGlvbikgZkJvZHlEZWNsYXJhdGlvbik7DQotDQotCQlmVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlpZiAocmVtb3ZlQW5ub3RhdGlvbihmQm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uTmFtZSkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJVGV4dEVkaXQgZWRpdCA9IGZVbml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVNZXRob2RBbm5vdGF0aW9uKElNZXRob2QgbWV0aG9kLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJQ29tcGlsYXRpb25Vbml0IG1jVW5pdCA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBkZWNsYXJpbmdUeXBlLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgbVVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChtY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIG1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIG1Vbml0KTsNCi0JCW1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbikgbUJvZHlEZWNsYXJhdGlvbik7DQotCQltVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlpZihyZW1vdmVBbm5vdGF0aW9uKG1Cb2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCksIGFubm90YXRpb25OYW1lKSkNCi0JCXsNCi0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gbVVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGRvYyk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVBhcmFtQW5ub3RhdGlvbihJVHlwZVBhcmFtZXRlciBwYXJhbSwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSU1ldGhvZCB0bXBNZXRob2QgPSAoSU1ldGhvZClwYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKTsNCi0JCS8vVE9ETyBjaGVjayB0aGlzDQotCQkvL3BhcmFtLmdldFBhcmVudCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUlDb21waWxhdGlvblVuaXQgbWNVbml0ID0gdG1wTWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJY2xhc3NOYW1lID0gdG1wTWV0aG9kLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotCQlDb21waWxhdGlvblVuaXQgbVVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChtY1VuaXQsIG51bGwpOw0KLQ0KLQkJQm9keURlY2xhcmF0aW9uIG1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIG1Vbml0KTsNCi0JCW1Cb2R5RGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKHRtcE1ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbikgbUJvZHlEZWNsYXJhdGlvbik7DQotDQotCQltVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlmb3IgKE9iamVjdCBvYmplY3QgOiAoKE1ldGhvZERlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKS5wYXJhbWV0ZXJzKCkpDQotCQl7DQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pDQotCQkJew0KLQkJCQlpZiAocmVtb3ZlQW5ub3RhdGlvbigoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIG9iamVjdCkubW9kaWZpZXJzKCksIGFubm90YXRpb25OYW1lKSkNCi0JCQkJew0KLQkJCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCk7DQotCQkJCQlUZXh0RWRpdCBlZGl0ID0gbVVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZW1vdmVzIHNwZWNpZmljIGFubm90YXRpb24gZnJvbSB0aGUgbGlzdCBvZiBtb2RpZmllcnMuDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9kaWZpZXJzDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZQ0KLQkgKiANCi0JICogQHJldHVybiBib29sZWFuIHZhbHVlLCB3aGljaCByZXByZXNlbnRzIHdoZXRlciB0aGUgYW5ub3RhdGlvbiBpcyByZW1vdmVkIG9yIG5vdC4NCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbihMaXN0IG1vZGlmaWVycywgU3RyaW5nIGFubm90YXRpb25OYW1lKQ0KLQl7DQotCQlBbm5vdGF0aW9uW10gbUFubm90YXRpb25zID0gZXh0cmFjdEFubm90YXRpb25zKG1vZGlmaWVycyk7DQotCQlmb3IgKEFubm90YXRpb24gbUFubm90YXRpb24gOiBtQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJaWYodmFsaWRhdGVBbm5vdGF0YXRpb24obUFubm90YXRpb24sIGFubm90YXRpb25OYW1lKSkNCi0JCQl7DQotCQkJCW1vZGlmaWVycy5yZW1vdmUobUFubm90YXRpb24pOw0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZUFubm90YXRpb25zKExpc3QgbW9kaWZpZXJzLCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uc1NldCkNCi0Jew0KLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7DQotCQlBbm5vdGF0aW9uW10gbUFubm90YXRpb25zID0gZXh0cmFjdEFubm90YXRpb25zKG1vZGlmaWVycyk7DQotCQlmb3IgKGludCBtYWkgPSAwOyBtYWkgPCBtQW5ub3RhdGlvbnMubGVuZ3RoOyBtYWkrKykNCi0JCXsNCi0JCQlpZiAoYW5ub3RhdGlvbnNTZXQgIT0gbnVsbCkNCi0JCQl7DQotCQkJCWlmIChhbm5vdGF0aW9uc1NldC5jb250YWlucyhtQW5ub3RhdGlvbnNbbWFpXS5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJbW9kaWZpZXJzLnJlbW92ZShtQW5ub3RhdGlvbnNbbWFpXSk7DQotCQkJCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0gZWxzZQ0KLQkJCXsNCi0JCQkJbW9kaWZpZXJzLnJlbW92ZShtQW5ub3RhdGlvbnNbbWFpXSk7DQotCQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBjaGFuZ2VkOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIEFubm90YXRpb25bXSBleHRyYWN0QW5ub3RhdGlvbnMoTGlzdCBtb2RpZmllcnMpDQotCXsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kaWZpZXJzLml0ZXJhdG9yKCk7DQotCQlTZXQ8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnNTZXQgPSBuZXcgSGFzaFNldDxBbm5vdGF0aW9uPigpOw0KLQ0KLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJRXh0ZW5kZWRNb2RpZmllciBtb2RpZiA9IChJRXh0ZW5kZWRNb2RpZmllcikgaXRlcmF0b3IubmV4dCgpOw0KLQkJCWlmIChtb2RpZi5pc0Fubm90YXRpb24oKSkNCi0JCQl7DQotCQkJCWFubm90YXRpb25zU2V0LmFkZCgoQW5ub3RhdGlvbikgbW9kaWYpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBhbm5vdGF0aW9uc1NldC50b0FycmF5KG5ldyBBbm5vdGF0aW9uW2Fubm90YXRpb25zU2V0LnNpemUoKV0pOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUFubm90YXRhdGlvbihBbm5vdGF0aW9uIG1Bbm5vdGF0aW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpDQotCXsNCi0JCVN0cmluZyBtQW5ub3RhdGlvblN0cmluZyA9IG1Bbm5vdGF0aW9uLnRvU3RyaW5nKCk7DQotCQlpbnQgaW5kZXggPSBtQW5ub3RhdGlvblN0cmluZy5pbmRleE9mKCIoIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmKGluZGV4ID09IC0xKQ0KLQkJew0KLQkJCW1Bbm5vdGF0aW9uU3RyaW5nID0gbUFubm90YXRpb25TdHJpbmcudHJpbSgpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCW1Bbm5vdGF0aW9uU3RyaW5nID0gbUFubm90YXRpb25TdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCk7DQotCQl9DQotCQkNCi0JCWlmKG1Bbm5vdGF0aW9uU3RyaW5nLmVuZHNXaXRoKGFubm90YXRpb25OYW1lKSkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCSANCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXJyYXlWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9BcnJheVZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMzE4NjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9BcnJheVZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBJQXJyYXlWYWx1ZX0NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXJyYXlWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwNCi17DQotCXByaXZhdGUgU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0aW9uDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWVzDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaW4gY2FzZSA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKi8NCi0JcHVibGljIEFycmF5VmFsdWVJbXBsKFNldDxJVmFsdWU+IHZhbHVlcykNCi0Jew0KLQkJaWYgKHZhbHVlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWVzIHNob3VsZCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQl0aGlzLnZhbHVlcyA9IHZhbHVlczsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCVN0cmluZyByZXN1bHQgPSAiWyI7IC8vJE5PTi1OTFMtMSQNCi0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOw0KLQkJZm9yIChJVmFsdWUgdmFsdWUgOiB2YWx1ZXMpDQotCQl7DQotCQkJaWYoZmlyc3QpDQotCQkJew0KLQkJCQlyZXN1bHQgPSByZXN1bHQgKyB2YWx1ZS50b1N0cmluZygpOw0KLQkJCQlmaXJzdCA9IGZhbHNlOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQlyZXN1bHQgPSByZXN1bHQgKyAiLCAiICsgdmFsdWUudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JCXJlc3VsdCA9IHJlc3VsdCArICJdIjsgLy8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQkvL1RPRE8gY2hlY2sgdGhpcyBtZXRob2QNCi0JCUFycmF5SW5pdGlhbGl6ZXIgYXJyID0gYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsNCi0JCWZvciAoSVZhbHVlIHZhbHVlIDogdmFsdWVzKQ0KLQkJew0KLQkJCWFyci5leHByZXNzaW9ucygpLmFkZCgoKFZhbHVlSW1wbCkgdmFsdWUpLmdldEV4cHJlc3Npb24odW5pdCwgYXN0KSk7DQotCQl9DQotDQotCQlyZXR1cm4gYXJyOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIEFycmF5cy5oYXNoQ29kZSh2YWx1ZXMudG9BcnJheShuZXcgSVZhbHVlW3ZhbHVlcy5zaXplKCldKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQXJyYXlWYWx1ZUltcGwgb3RoZXIgPSAoQXJyYXlWYWx1ZUltcGwpIG9iajsNCi0JCXJldHVybiBBcnJheXMuZXF1YWxzKHZhbHVlcy50b0FycmF5KG5ldyBJVmFsdWVbdmFsdWVzLnNpemUoKV0pLCBvdGhlci52YWx1ZXMudG9BcnJheShuZXcgSVZhbHVlW3ZhbHVlcy5zaXplKCldKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0F0dHJpYnV0ZVR5cGVFbnVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXR0cmlidXRlVHlwZUVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTBiYTYwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXR0cmlidXRlVHlwZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotcHVibGljIGVudW0gQXR0cmlidXRlVHlwZUVudW0gDQotew0KLQlCT09MRUFOKCJCb29sZWFuIiksIC8vJE5PTi1OTFMtMSQNCi0JQ0xBU1MoIkNsYXNzIiksIC8vJE5PTi1OTFMtMSQNCi0JSU5URUdFUigiSW50ZWdlciIpLCAvLyROT04tTkxTLTEkDQotCVFVQUxJRklFRF9OQU1FKCJRdWFsaWZpZWQgTmFtZSIpLCAvLyROT04tTkxTLTEkDQotCVNUUklORygiU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQNCi0JDQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOw0KLSAgICANCi0gICAgQXR0cmlidXRlVHlwZUVudW0oZmluYWwgU3RyaW5nIHZhbHVlKQ0KLSAgICB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgZmluYWwgU3RyaW5nIGdldFZhbHVlKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Jvb2xlYW5WYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Cb29sZWFuVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZmUxZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Jvb2xlYW5WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgSUJvb2xlYW5WYWx1ZX0NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQm9vbGVhblZhbHVlSW1wbCBleHRlbmRzIFZhbHVlSW1wbA0KLXsgLy8kSkwtRVFVQUxTJA0KLQlwcml2YXRlIGJvb2xlYW4gdmFsdWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgQm9vbGVhblZhbHVlSW1wbChib29sZWFuIHZhbHVlKQ0KLQl7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpDQotCXsNCi0JCXJldHVybiBhc3QubmV3Qm9vbGVhbkxpdGVyYWwodmFsdWUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCXJldHVybiBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQm9vbGVhblZhbHVlSW1wbCBvdGhlciA9IChCb29sZWFuVmFsdWVJbXBsKSBvYmo7DQotCQlyZXR1cm4gdmFsdWUgPT0gb3RoZXIudmFsdWU7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0NsYXNzVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQ2xhc3NWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRjZWE1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQ2xhc3NWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xhc3NWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwgDQotew0KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc1FOYW1lOw0KLQ0KLSAgICBwdWJsaWMgQ2xhc3NWYWx1ZUltcGwoU3RyaW5nIGNsYXNzUU5hbWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMuY2xhc3NRTmFtZSA9IGNsYXNzUU5hbWU7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0gICAgew0KLSAgICAgICAgU3RyaW5nIGNsc05hbWUgPSB0aGlzLmNsYXNzUU5hbWU7DQotICAgICAgICBpZiAoYWRkSW1wb3J0cyhhc3QsIHVuaXQsIGNsc05hbWUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGNsc05hbWUgPSBnZXRTaW1wbGVOYW1lKGNsc05hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgTmFtZSBuYW1lID0gYXN0Lm5ld05hbWUoY2xzTmFtZSk7DQotICAgICAgICBTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSBhc3QubmV3U2ltcGxlVHlwZShuYW1lKTsNCi0gICAgICAgIFR5cGVMaXRlcmFsIGxpdGVyYWwgPSBhc3QubmV3VHlwZUxpdGVyYWwoKTsNCi0gICAgICAgIGxpdGVyYWwuc2V0VHlwZShzaW1wbGVUeXBlKTsNCi0gICAgICAgIHJldHVybiBsaXRlcmFsOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuY2xhc3NRTmFtZTsNCi0JfQ0KLSAgICANCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5jbGFzc1FOYW1lLmhhc2hDb2RlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgQ2xhc3NWYWx1ZUltcGwgb3RoZXIgPSAoQ2xhc3NWYWx1ZUltcGwpIG9iajsNCi0JCXJldHVybiB0aGlzLmNsYXNzUU5hbWUuZXF1YWxzKG90aGVyLmNsYXNzUU5hbWUpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9JbnRlZ2VyVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvSW50ZWdlclZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYWZmZTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9JbnRlZ2VyVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7DQotDQotLyoqDQotICogSW1wbGVtZW50b3IgZm9yIElJbnRlZ2VyVmFsdWUNCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW50ZWdlclZhbHVlSW1wbCBleHRlbmRzIFZhbHVlSW1wbA0KLXsNCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgSW50ZWdlclZhbHVlSW1wbChTdHJpbmcgdmFsdWUpDQotCXsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0Jew0KLQkJTnVtYmVyTGl0ZXJhbCBsaXRlcmFsID0gYXN0Lm5ld051bWJlckxpdGVyYWwoKTsNCi0gICAgICAgIGxpdGVyYWwuc2V0VG9rZW4obmV3IEludGVnZXIodmFsdWUpLnRvU3RyaW5nKCkpOw0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEludGVnZXIodmFsdWUpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIEludGVnZXJWYWx1ZUltcGwgb3RoZXIgPSAoSW50ZWdlclZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHZhbHVlID09IG90aGVyLnZhbHVlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpDQotCXsNCi0JCXJldHVybiB2YWx1ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvTG9jYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Mb2NhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OWU4NTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Mb2NhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLQ0KLS8qKg0KLSAqIEltcGxlbWVudG9yIG9mIHtAbGluayBJTG9jYXRvcn0gaW50ZXJmYWNlDQotICovDQotcHVibGljIGNsYXNzIExvY2F0b3JJbXBsIGltcGxlbWVudHMgSUxvY2F0b3INCi17DQotCXByaXZhdGUgaW50IGxpbmVOdW1iZXI7DQotCXByaXZhdGUgaW50IHN0YXJ0UG9zaXRpb247DQotCXByaXZhdGUgaW50IGxlbmd0aDsNCi0JDQotCXB1YmxpYyBMb2NhdG9ySW1wbChmaW5hbCBpbnQgbGluZU51bWJlciwgZmluYWwgaW50IHN0YXJ0UG9zaXRpb24sIGZpbmFsIGludCBsZW5ndGgpDQotCXsNCi0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOw0KLQkJdGhpcy5zdGFydFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsNCi0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7DQotCX0NCi0JDQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMubGVuZ3RoOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRQb3NpdGlvbigpDQotCXsNCi0JCXJldHVybiB0aGlzLnN0YXJ0UG9zaXRpb247DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgDQotCXsNCi0JCXJldHVybiBsaW5lTnVtYmVyOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9QYXJhbVZhbHVlUGFpckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9QYXJhbVZhbHVlUGFpckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWNlMzFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUGFyYW1WYWx1ZVBhaXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotLyoqDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotDQotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVQYWlySW1wbCBpbXBsZW1lbnRzIElQYXJhbVZhbHVlUGFpcg0KLXsNCi0JDQotCXByaXZhdGUgSUxvY2F0b3IgbG9jYXRvciA9IG51bGw7DQotDQotDQotCXByaXZhdGUgU3RyaW5nIHBhcmFtOw0KLQ0KLQlwcml2YXRlIElWYWx1ZSB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgUGFyYW1WYWx1ZVBhaXJJbXBsKFN0cmluZyBwYXJhbSwgSVZhbHVlIHZhbHVlKQ0KLQl7DQotCQl0aGlzLnBhcmFtID0gcGFyYW07DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRQYXJhbSgpDQotCXsNCi0JCXJldHVybiBwYXJhbTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVZhbHVlIGdldFZhbHVlKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJaWYodmFsdWUgIT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gMzEgKiBwYXJhbS5oYXNoQ29kZSgpICsgdmFsdWUuaGFzaENvZGUoKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlyZXR1cm4gMzEgKiBwYXJhbS5oYXNoQ29kZSgpOw0KLQkJfQ0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIFBhcmFtVmFsdWVQYWlySW1wbCBvdGhlciA9IChQYXJhbVZhbHVlUGFpckltcGwpIG9iajsNCi0JCWlmICghcGFyYW0uZXF1YWxzKG90aGVyLnBhcmFtKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlyZXR1cm4gdmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKTsNCi0JfQ0KLQkNCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5sb2NhdG9yOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldExvY2F0b3IoZmluYWwgSUxvY2F0b3IgbG9jYXRvcikNCi0Jew0KLQkJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1F1YWxpZmllZE5hbWVWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWJiNjZjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotDQotLyoqDQotICogSW1wbGVtZW50b3IgZm9yIHtAbGluayBJUXVhbGlmaWVkTmFtZVZhbHVlfQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsIGV4dGVuZHMgVmFsdWVJbXBsDQotew0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICovDQotCXB1YmxpYyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsKFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQkvLyAiamF2YXguZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFRCINCi0JCWludCBpID0gdmFsdWUubGFzdEluZGV4T2YoJy4nKTsNCi0JCWlmIChpICE9IC0xKQ0KLQkJew0KLQkJCVN0cmluZyBjbHNOYW1lID0gdmFsdWUuc3Vic3RyaW5nKDAsIGkpOw0KLQkJCWlmIChhZGRJbXBvcnRzKGFzdCwgdW5pdCwgY2xzTmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gYXN0Lm5ld05hbWUoZ2V0U2ltcGxlTmFtZShjbHNOYW1lKSArIHZhbHVlLnN1YnN0cmluZyhpKSk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGFzdC5uZXdOYW1lKHZhbHVlKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCXJldHVybiB2YWx1ZS5oYXNoQ29kZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIFF1YWxpZmllZE5hbWVWYWx1ZUltcGwgb3RoZXIgPSAoUXVhbGlmaWVkTmFtZVZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9TdHJpbmdWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9TdHJpbmdWYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThiZDFiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvU3RyaW5nVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7DQotDQotLyoqDQotICogSW1wbGVtZW50b3IgZm9yIElTdHJpbmdWYWx1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTdHJpbmdWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwNCi17DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZ1ZhbHVlSW1wbChTdHJpbmcgdmFsdWUpDQotCXsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0Jew0KLQkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsNCi0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKHZhbHVlKTsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlLmhhc2hDb2RlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgU3RyaW5nVmFsdWVJbXBsIG90aGVyID0gKFN0cmluZ1ZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9WYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9WYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODhjNTcxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbXBvcnREZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWx1ZUltcGwgaW1wbGVtZW50cyBJVmFsdWUNCi17DQotCXByaXZhdGUgSUxvY2F0b3IgbG9jYXRvciA9IG51bGw7DQotDQotCXByb3RlY3RlZCBhYnN0cmFjdCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpOw0KLQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByb3RlY3RlZCBib29sZWFuIGFkZEltcG9ydHMoQVNUIGFzdCwgQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkNCi0Jew0KLQkJU3RyaW5nIHBhY2thZ2VBbm5vdGF0aW9uTmFtZSA9IGdldFBhY2thZ2VOYW1lKGFubm90YXRpb25OYW1lKTsNCi0JCWlmIChwYWNrYWdlQW5ub3RhdGlvbk5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAocGFja2FnZUFubm90YXRpb25OYW1lLmVxdWFscygiamF2YS5sYW5nIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmICh1bml0ICE9IG51bGwpDQotCQl7DQotCQkJSW1wb3J0RGVjbGFyYXRpb24gaW1wID0gYXN0Lm5ld0ltcG9ydERlY2xhcmF0aW9uKCk7DQotCQkJaW1wLnNldE5hbWUoYXN0Lm5ld05hbWUoYW5ub3RhdGlvbk5hbWUpKTsNCi0JCQlMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzID0gdW5pdC5pbXBvcnRzKCk7DQotCQkJU3RyaW5nIGltcDEgPSBnZXRJbXBvcnQoaW1wb3J0cywgZ2V0U2ltcGxlTmFtZShhbm5vdGF0aW9uTmFtZSkpOw0KLQkJCWlmIChpbXAxID09IG51bGwpDQotCQkJew0KLQkJCQlpZiAoZ2V0T25EZW1hbmRJbXBvcnQoaW1wb3J0cywgcGFja2FnZUFubm90YXRpb25OYW1lKSA9PSBudWxsKQ0KLQkJCQl7DQotCQkJCQlpbXBvcnRzLmFkZChpbXApOw0KLQkJCQl9DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlpZiAoIWltcDEuZXF1YWxzKGFubm90YXRpb25OYW1lKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEltcG9ydChMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzLCBTdHJpbmcgaW1wKQ0KLQl7DQotCQlJdGVyYXRvcjxJbXBvcnREZWNsYXJhdGlvbj4gaXRlciA9IGltcG9ydHMuaXRlcmF0b3IoKTsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJbXBvcnREZWNsYXJhdGlvbiBuZXh0ID0gaXRlci5uZXh0KCk7DQotCQkJTmFtZSBmcU5hbWUgPSBuZXh0LmdldE5hbWUoKTsNCi0JCQlTaW1wbGVOYW1lIG5hbWU7DQotCQkJaWYgKGZxTmFtZS5pc1F1YWxpZmllZE5hbWUoKSkNCi0JCQl7DQotCQkJCW5hbWUgPSAoKFF1YWxpZmllZE5hbWUpIGZxTmFtZSkuZ2V0TmFtZSgpOw0KLQkJCX0gZWxzZQ0KLQkJCXsNCi0JCQkJbmFtZSA9IChTaW1wbGVOYW1lKSBmcU5hbWU7DQotCQkJfQ0KLQkJCVN0cmluZyBzaW1wbGVOYW1lID0gbmFtZS5nZXRJZGVudGlmaWVyKCk7DQotCQkJaWYgKGltcC5lcXVhbHMoc2ltcGxlTmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gZnFOYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE9uRGVtYW5kSW1wb3J0KExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMsIFN0cmluZyBpbXApDQotCXsNCi0JCUl0ZXJhdG9yPEltcG9ydERlY2xhcmF0aW9uPiBpdGVyID0gaW1wb3J0cy5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUltcG9ydERlY2xhcmF0aW9uIG5leHQgPSBpdGVyLm5leHQoKTsNCi0JCQlpZiAoIW5leHQuaXNPbkRlbWFuZCgpKQ0KLQkJCXsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCU5hbWUgZnFOYW1lID0gbmV4dC5nZXROYW1lKCk7DQotCQkJU3RyaW5nIG5hbWUgPSBmcU5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotCQkJaWYgKGltcC5lcXVhbHMobmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gbmFtZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgbmFtZSkNCi0Jew0KLQkJaW50IGkgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7DQotCQlpZiAoaSA9PSAtMSkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKFN0cmluZyBuYW1lKQ0KLQl7DQotCQlpbnQgaSA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsNCi0JCWlmIChpID09IC0xKQ0KLQkJCXJldHVybiBuYW1lOw0KLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGkgKyAxKTsNCi0JfQ0KLQkNCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5sb2NhdG9yOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldExvY2F0b3IoZmluYWwgSUxvY2F0b3IgbG9jYXRvcikNCi0Jew0KLQkJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3BsdWdpbi9KYXh3c1V0aWxzUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3BsdWdpbi9KYXh3c1V0aWxzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0ZDNmYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9wbHVnaW4vSmF4d3NVdGlsc1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwucGx1Z2luOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEpheHdzVXRpbHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gaW1wbGVtZW50cyBJU3RhcnR1cA0KLXsNCi0JLy8gVGhlIHBsdWctaW4gSUQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscyI7DQotDQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JcHJpdmF0ZSBzdGF0aWMgSmF4d3NVdGlsc1BsdWdpbiBwbHVnaW47DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgSmF4d3NVdGlsc1BsdWdpbigpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQkJDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEpheHdzVXRpbHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi0JcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkNCi0Jew0KLQkJLy8gTm90aGluZyB0byBkby4gSG93ZXZlciwgdGhpcyBwdWdpbiBoYXMgdG8gc3RhcnQgYXMgZWFybHkgYXMgcG9zc2libGUgc2luY2UgaXRzIHNlcnZpY2VzIHdpbGwgYmUgdXNlZCBmb3IgY29tbW9uIGxvZ2dpbmcNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3RleHQvSmF4V3NVdGlsTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTM3NmI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4V3NVdGlsTWVzc2FnZXMgZXh0ZW5kcyBOTFMNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYW5ub3RQZXJmb3JtRWRpdE1zZzsNCi0NCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcFVuaXRNaXNzaW5nTXNnOw0KLQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkVHJlZVN0YXRlTXNnOw0KLQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uQ2Fubm90QmVTdG9yZWRNc2c7DQotDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25VdGlsc19QYXJhbVNob3VsZE5vdEJlTnVsbE1zZzsNCi0NCi0vLw0KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZ2luZURhdGFQcm92aWRlcl9VbmFibGVUb0RldGVybWluZVBvcnRPZkRlcGxveVNlcnZlck1zZzsNCi0vLwkNCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmdpbmVEYXRhUHJvdmlkZXJfVW5hYmxlVG9EZXRlcm1pbmVOYW1lT2ZEZXBsb3lTZXJ2ZXJNc2c7DQotLy8NCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmdpbmVEYXRhUHJvdmlkZXJfVW5hYmxlVG9EZXRlcm1pbmVTYXBTeXN0ZW1PZkRlcGxveVNlcnZlck1zZzsNCi0vLw0KLS8vDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdzZGxOYW1lc1ZhbGlkYXRvcl9FbXB0eVhtbE5hbWU7DQotCQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXc2RsTmFtZXNWYWxpZGF0b3JfSW52YWxpZE5DTmFtZTsNCi0JDQotCS8qKiBtZXNzYWdlIGNvbnN0YW50ICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdzZGxOYW1lc1ZhbGlkYXRvcl9FbXB0eVhtbE5hbWUyOw0KLQkNCi0JLyoqIG1lc3NhZ2UgY29uc3RhbnQgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV3NkbE5hbWVzVmFsaWRhdG9yX0ludmFsaWROQ05hbWUyOwkNCi0JDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRSZXNvdXJjZXNNYW5hZ2VyX0ZJTEVfQ09OVEVOVFNfQ0hBTkdFX0ZBSUxFRF9NU0c7DQotCQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0TWFuYWdlbWVudFV0aWxzX1Byb2plY3RIYXNOb01ldGFJbmZGb2xkZXJNc2c7DQotCQ0KLQlzdGF0aWMNCi0Jew0KLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSmF4V3NVdGlsTWVzc2FnZXMuY2xhc3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC90ZXh0L0pheFdzVXRpbE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlY2EzMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC90ZXh0L0pheFdzVXRpbE1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotQ2Fubm90UGVyZm9ybUVkaXRNc2cJCQkJCQkJCQkJCQk9IEVkaXQgY2Fubm90IGJlIHBlcmZvcm1lZA0KLUNvbXBVbml0TWlzc2luZ01zZwkJCQkJCQkJCQkJCQk9IENvbXBpbGF0aW9uIHVuaXQgZmlsZSBtaXNzaW5nDQotSW52YWxpZFRyZWVTdGF0ZU1zZwkJCQkJCQkJCQkJCQk9IEludmFsaWQgcHJvamVjdCB0cmVlIHN0YXRlDQotQW5ub3RhdGlvbkNhbm5vdEJlU3RvcmVkTXNnCQkJCQkJCQkJCQk9IEFubm90YXRpb24gY291bGQgbm90IGJlIHN0b3JlZCwgdGhlIGZpbGUgaXMgbm90IHdyaXRhYmxlDQotQW5ub3RhdGlvblV0aWxzX1BhcmFtU2hvdWxkTm90QmVOdWxsTXNnCQkJCQkJCQk9IHswfSBzaG91bGQgbm90IGJlIG51bGwNCi0NCi1Xc2RsTmFtZXNWYWxpZGF0b3JfRW1wdHlYbWxOYW1lCQkJCQkJCQkJCT0gRW1wdHkgezB9IG5hbWUgaXMgbm90IGFsbG93ZWQuIFBsZWFzZSBlbnRlciBuYW1lLg0KLVdzZGxOYW1lc1ZhbGlkYXRvcl9JbnZhbGlkTkNOYW1lCQkJCQkJCQkJPSBUaGUgc3ltYm9sIHswfSBzcGVjaWZpZWQgZm9yIHsxfSB3aXRoIG5hbWUgezJ9IGlzIG5vdCBhbGxvd2VkIGZvciBOQ05hbWUuIFBsZWFzZSBjaGFuZ2UgezF9IG5hbWUuDQotV3NkbE5hbWVzVmFsaWRhdG9yX0VtcHR5WG1sTmFtZTIJCQkJCQkJCQk9IFNwZWNpZmllZCB7MH0gc2hvdWxkIG5vdCBiZSBlbXB0eQ0KLVdzZGxOYW1lc1ZhbGlkYXRvcl9JbnZhbGlkTkNOYW1lMgkJCQkJCQkJCT0gVGhlIHN5bWJvbCBcInswfVwiIHVzZWQgaW4gezF9IGlzIG5vdCBhbGxvd2VkIGluIE5DTmFtZQ0KLQ0KLUVkaXRSZXNvdXJjZXNNYW5hZ2VyX0ZJTEVfQ09OVEVOVFNfQ0hBTkdFX0ZBSUxFRF9NU0cJCQkJPSBGaWxlIGNvbnRlbnRzIGNvdWxkIG5vdCBiZSBzZXQNCi1Qcm9qZWN0TWFuYWdlbWVudFV0aWxzX1Byb2plY3RIYXNOb01ldGFJbmZGb2xkZXJNc2cJCQkJCT0gcHJvamVjdCB7MH0gZG9lcyBub3QgaGF2ZSBhIE1FVEEtSU5GIGZvbGRlcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvbG9nZ2luZy9JTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlN2Y5MmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvbG9nZ2luZy9JTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUxvZ2dlcg0KLXsNCi0JLyoqDQotCSAqIExvZ3MgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgZXJyb3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IGVycm9yLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZA0KLQkgKiBAcGFyYW0gY2F1c2UNCi0JICogICAgICAgICAgICBjYXVzaW5nIGV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IHdhcm5pbmcuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuKGZpbmFsIFN0cmluZyBtZXNzYWdlKTsNCi0NCi0JLyoqDQotCSAqIExvZ3MgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgd2FybmluZy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQNCi0JICogQHBhcmFtIGNhdXNlDQotCSAqICAgICAgICAgICAgY2F1c2luZyBleGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIGxvZ1dhcm4oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IGRlYnVnLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgbG9nRGVidWcoZmluYWwgU3RyaW5nIG1lc3NhZ2UpOw0KLQ0KLQkvKioNCi0JICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSBkZWJ1Zy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQNCi0JICogQHBhcmFtIGNhdXNlDQotCSAqICAgICAgICAgICAgY2F1c2luZyBleGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIGxvZ0RlYnVnKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpOw0KLQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmYWQzMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9sb2dnaW5nL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5TdGF0dXNVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnBsdWdpbi5KYXh3c1V0aWxzUGx1Z2luOw0KLQ0KLXB1YmxpYyBjbGFzcyBMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyDQotew0KLQlwdWJsaWMgdm9pZCBsb2dEZWJ1ZyhTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLS8vCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzSW5mbyhtZXNzYWdlKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9nRGVidWcoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkNCi0Jew0KLS8vCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzSW5mbyhtZXNzYWdlLCBjYXVzZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlsb2coKS5sb2coU3RhdHVzVXRpbHMuc3RhdHVzRXJyb3IobWVzc2FnZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNFcnJvcihtZXNzYWdlLCBjYXVzZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ1dhcm4oU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNXYXJuaW5nKG1lc3NhZ2UpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBsb2dXYXJuKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNXYXJuaW5nKG1lc3NhZ2UsIGNhdXNlKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJTG9nIGxvZygpDQotCXsNCi0JCXJldHVybiBKYXh3c1V0aWxzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlYnVnKCkNCi0Jew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0VkaXRSZXNvdXJjZXNNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9FZGl0UmVzb3VyY2VzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjM5OGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0VkaXRSZXNvdXJjZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLlN0YXR1c1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCBpcyBtZWFudCB0byBwcm92aWRlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IHRvIHNhdmUgYW5kIG1vZGlmeSByZXNvdXJjZXMuIEl0IGlzIGEgd3JhcHBlciBvZiB0aGUgZWNsaXBzZSBBUEkgYW5kDQotICogd29ya2Fyb3VuZHMgc29tZSBEVFIgaXNzdWVzLiBVbnRpbCBEVFIgY29sbGVhZ3VlcyBmaXggdGhlaXIgY29kaW5nLCB0aGlzIG1hbmFnZXIgbXVzdCBiZSB1c2VkIG9uIGVhY2ggZmlsZSBtb2RpZmljYXRpb24gb2NjYXNpb24NCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFZGl0UmVzb3VyY2VzTWFuYWdlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUxvZ2dlciBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7DQotCQ0KLQkvKioNCi0JICogU2V0cyBlZGl0YWJpbGl0eSBvZiBhIGZpbGUuIEluIGNhc2UgdGhlIGZpbGUgc3BlY2lmaWVkIGlzIGFscmVhZHkgd3JpdGFibGUsIDxjb2RlPlN0YXR1cy5PS19TVEFUVVM8L2NvZGU+IGlzIHJldHVybmVkDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZQ0KLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIHRvIGJlIHNldCBlZGl0YWJsZQ0KLQkgKiBAcGFyYW0gY29udGV4dA0KLQkgKiAgICAgICAgICAgIGVpdGhlciB7QGxpbmsgSVdvcmtzcGFjZSNWQUxJREFURV9QUk9NUFR9LCBvciB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUgdXNlZCB0byBwYXJlbnQgYW55DQotCSAqICAgICAgICAgICAgZGlhbG9ncyB3aXRoIHRoZSB1c2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGF2b2lkIGFueSBkaXJlY3QNCi0JICogICAgICAgICAgICByZWZlcmVuY2VzIG9uIHRoZSBTV1QgY29tcG9uZW50KQ0KLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgc3BlY2lmaWVkIGlzIG51bGwNCi0JICogQHNlZSBJV29ya3NwYWNlI1ZBTElEQVRFX1BST01QVA0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZUVkaXRhYmxlKElGaWxlIGZpbGUsIE9iamVjdCBjb250ZXh0KQ0KLQl7DQotCQlpZiAoZmlsZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmlsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighZmlsZS5pc1JlYWRPbmx5KCkpDQotCQl7DQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQl9DQotCQkNCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gZmlsZS5nZXRXb3Jrc3BhY2UoKTsNCi0JCXJldHVybiB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtdIHsgZmlsZSB9LCBjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyBlZGl0YWJsaWxpdHkgb2YgYSBmaWxlLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcNCi0JICogPGNvZGU+c2V0RmlsZUVkaXRhYmxlKGZpbGUsIElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUKTwvY29kZT4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlDQotCSAqICAgICAgICAgICAgVGhlIGZpbGUgdG8gYmUgc2V0IGVkaXRhYmxlDQotCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgaXMgbnVsbA0KLQkgKiBAc2VlIEVkaXRSZXNvdXJjZXNNYW5hZ2VyI3NldEZpbGVFZGl0YWJsZShJRmlsZSwgT2JqZWN0KQ0KLQkgKiBAc2VlIElXb3Jrc3BhY2UjVkFMSURBVEVfUFJPTVBUDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZUVkaXRhYmxlKElGaWxlIGZpbGUpDQotCXsNCi0JCXJldHVybiBzZXRGaWxlRWRpdGFibGUoZmlsZSwgSVdvcmtzcGFjZS5WQUxJREFURV9QUk9NUFQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIGVkaXRhYmxpbGl0eSBvZiBhbiBhcnJheSBvZiBmaWxlcy4gSW4gY2FzZSBhbGwgZmlsZXMgc3BlY2lmaWVkIGFyZSBhbHJlYWR5IHdyaXRhYmxlLCA8Y29kZT5TdGF0dXMuT0tfU1RBVFVTPC9jb2RlPiBpcyByZXR1cm5lZA0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVzDQotCSAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIGZpbGVzIHRvIGJlIHNldCBlZGl0YWJsZQ0KLQkgKiBAcGFyYW0gY29udGV4dA0KLQkgKiAgICAgICAgICAgIGVpdGhlciB7QGxpbmsgSVdvcmtzcGFjZSNWQUxJREFURV9QUk9NUFR9LCBvciB0aGUgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw8L2NvZGU+IHRoYXQgaXMgdG8gYmUgdXNlZCB0byBwYXJlbnQgYW55DQotCSAqICAgICAgICAgICAgZGlhbG9ncyB3aXRoIHRoZSB1c2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBVSSBjb250ZXh0IChkZWNsYXJlZCBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGF2b2lkIGFueSBkaXJlY3QNCi0JICogICAgICAgICAgICByZWZlcmVuY2VzIG9uIHRoZSBTV1QgY29tcG9uZW50KQ0KLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBhcnJheSBpcyBlbXB0eSBvciBudWxsDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlc0VkaXRhYmxlKElGaWxlW10gZmlsZXMsIE9iamVjdCBjb250ZXh0KQ0KLQl7DQotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSBtdXN0IG5vdCBiZSBlbXB0eSBub3IgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlMaXN0PElGaWxlPiByb0ZpbGVzID0gbmV3IEFycmF5TGlzdDxJRmlsZT4oKTsNCi0JCWZvcihJRmlsZSBmIDogZmlsZXMpDQotCQl7DQotCQkJaWYoZi5pc1JlYWRPbmx5KCkpDQotCQkJew0KLQkJCQlyb0ZpbGVzLmFkZChmKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmKHJvRmlsZXMuc2l6ZSgpID09IDApDQotCQl7DQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQl9DQotDQotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IHJvRmlsZXMuZ2V0KDApLmdldFdvcmtzcGFjZSgpOw0KLQkJcmV0dXJuIHdvcmtzcGFjZS52YWxpZGF0ZUVkaXQocm9GaWxlcy50b0FycmF5KG5ldyBJRmlsZVtyb0ZpbGVzLnNpemUoKV0pLCBjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyBlZGl0YWJsaWxpdHkgb2YgYW4gYXJyYXkgb2YgZmlsZXMuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0byBpbnZva2luZw0KLQkgKiA8Y29kZT5zZXRGaWxlc0VkaXRhYmxlKGZpbGVzLCBJV29ya3NwYWNlLlZBTElEQVRFX1BST01QVCk8L2NvZGU+IA0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVzDQotCSAqICAgICAgICAgICAgVGhlIGFycmF5IG9mIGZpbGVzIHRvIGJlIHNldCBlZGl0YWJsZQ0KLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBhcnJheSBpcyBlbXB0eSBvciBudWxsDQotCSAqIEBzZWUgRWRpdFJlc291cmNlc01hbmFnZXIjc2V0RmlsZXNFZGl0YWJsZShJRmlsZVtdLCBPYmplY3QpDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlc0VkaXRhYmxlKElGaWxlW10gZmlsZXMpDQotCXsNCi0JCXJldHVybiBzZXRGaWxlc0VkaXRhYmxlKGZpbGVzLCBJV29ya3NwYWNlLlZBTElEQVRFX1BST01QVCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZQ0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHNldA0KLQkgKiBAcGFyYW0gY29udGVudA0KLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHRvIGJlIHNldA0KLQkgKiBAcGFyYW0gdXBkYXRlRmxhZ3MNCi0JICogICAgICAgICAgICB1cGRhdGUgZmxhZ3MuDQotCSAqIEBzZWUgSUZpbGUjc2V0Q29udGVudHMoamF2YS5pby5JbnB1dFN0cmVhbSwgaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yDQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcyByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQNCi0JICogQHJldHVybiBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+ZmlsZTwvY29kZT4gb3IgPGNvZGU+Y29udGVudDwvY29kZT4gaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgc2V0RmlsZUNvbnRlbnRzKElGaWxlIGZpbGUsIFN0cmluZyBjb250ZW50LCBpbnQgdXBkYXRlRmxhZ3MsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKQ0KLQl7DQotCQlpZiAoZmlsZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmlsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZiAoY29udGVudCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY29udGVudCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlJU3RhdHVzIGVkaXRTdGF0dXMgPSBzZXRGaWxlRWRpdGFibGUoZmlsZSk7DQotCQlpZiAoZWRpdFN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spDQotCQl7DQotCQkJLy8gc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgdmFsaWRhdGVFZGl0IG9wZXJhdGlvbg0KLQkJCXJldHVybiBlZGl0U3RhdHVzOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJZmlsZS5zZXRDb250ZW50cyhuZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKGNvbnRlbnQpLCB1cGRhdGVGbGFncywgcHJvZ3Jlc3NNb25pdG9yKTsNCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXJldHVybiBTdGF0dXNVdGlscy5zdGF0dXNFcnJvcihKYXhXc1V0aWxNZXNzYWdlcy5FZGl0UmVzb3VyY2VzTWFuYWdlcl9GSUxFX0NPTlRFTlRTX0NIQU5HRV9GQUlMRURfTVNHLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBvZiBhIGZpbGUuIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgb2YgaW52b2tpbmcNCi0JICogPGNvZGU+c2V0RmlsZUNvbnRlbnMoSUZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQsIChrZWVwSGlzdG9yeSA/IElGaWxlLktFRVBfSElTVE9SWSA6IElSZXNvdXJjZS5OT05FKSB8IChmb3JjZSA/IElGaWxlLkZPUkNFIDogSVJlc291cmNlLk5PTkUpLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGUNCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSBzZXQNCi0JICogQHBhcmFtIGNvbnRlbnQNCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0byBiZSBzZXQNCi0JICogQHBhcmFtIGZvcmNlDQotCSAqICAgICAgICAgICAgYSBmbGFnIGNvbnRyb2xsaW5nIGhvdyB0byBkZWFsIHdpdGggcmVzb3VyY2VzIHRoYXQgYXJlIG5vdCBpbiBzeW5jIHdpdGggdGhlIGxvY2FsIGZpbGUgc3lzdGVtDQotCSAqIEBwYXJhbSBrZWVwSGlzdG9yeQ0KLQkgKiAgICAgICAgICAgIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHN0b3JlIHRoZSBjdXJyZW50IGNvbnRlbnRzIGluIHRoZSBsb2NhbCBoaXN0b3J5DQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcyByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQNCi0JICogQHJldHVybiBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+ZmlsZTwvY29kZT4gb3IgPGNvZGU+Y29udGVudDwvY29kZT4gaXMgbnVsbA0KLQkgKiBAc2VlIEVkaXRSZXNvdXJjZXNNYW5hZ2VyI3NldEZpbGVDb250ZW50cyhJRmlsZSwgU3RyaW5nLCBpbnQsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlQ29udGVudHMoSUZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4ga2VlcEhpc3RvcnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0Jew0KLQkJcmV0dXJuIHNldEZpbGVDb250ZW50cyhmaWxlLCBjb250ZW50LCAoKGtlZXBIaXN0b3J5ID8gSUZpbGUuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLk5PTkUpIHwgKGZvcmNlID8gSUZpbGUuRk9SQ0UgOiBJUmVzb3VyY2UuTk9ORSkpLCBtb25pdG9yKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9GaWxlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0ZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZGRiM2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0ZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gZm9yIGZpbGUgdXRpbGl0aWVzIGludGVyZmFjZQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIEZpbGVVdGlscyBpbXBsZW1lbnRzIElGaWxlVXRpbHMgew0KLQlwcml2YXRlIHN0YXRpYyBJRmlsZVV0aWxzIHV0aWxzID0gbnVsbDsNCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4ID0gMDsNCi0NCi0JcHVibGljIEZpbGVVdGlscygpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIGZhY3RvcnkgbWV0aG9kDQotCSAqIA0KLQkgKiBAcmV0dXJuIGEgRmlsZVV0aWxzIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElGaWxlVXRpbHMgZ2V0SW5zdGFuY2UoKSB7DQotCQlpZiAodXRpbHMgPT0gbnVsbCkgew0KLQkJCXV0aWxzID0gbmV3IEZpbGVVdGlscygpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHV0aWxzOw0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCBMaXN0PElFZGl0b3JQYXJ0PiBnZXRFZGl0b3JzQnlGaWxlTG9jYXRpb24oDQotCQkJZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlMaXN0PElDb21waWxhdGlvblVuaXQ+IHVuaXRzID0gZ2V0Q29tcGlsYXRpb25Vbml0cyhmaWxlTG9jYXRpb24pOw0KLQkJU2V0PElFZGl0b3JQYXJ0PiBlZGl0b3JzID0gbmV3IEhhc2hTZXQ8SUVkaXRvclBhcnQ+KCk7DQotCQlmb3IgKElDb21waWxhdGlvblVuaXQgY3UgOiB1bml0cykgew0KLQkJCWZpbmFsIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyID0gZ2V0RWRpdG9yRGVzY3JpcHRvcihjdQ0KLQkJCQkJLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCWVkaXRvcnMuYWRkQWxsKGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdChlZGl0b3JEZXNjciwNCi0JCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFBhZ2UoKSwgY3UpKTsNCi0NCi0JCX0NCi0NCi0JCXJldHVybiBBcnJheXMuYXNMaXN0KGVkaXRvcnMudG9BcnJheShuZXcgSUVkaXRvclBhcnRbZWRpdG9ycy5zaXplKCldKSk7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIExpc3Q8SUNvbXBpbGF0aW9uVW5pdD4gZ2V0Q29tcGlsYXRpb25Vbml0cygNCi0JCQlmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsNCi0JCWlmIChmaWxlTG9jYXRpb24gPT0gbnVsbCkgew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmlsZUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCUlGaWxlW10gZmlsZXNGb3VuZCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkNCi0JCQkJLmZpbmRGaWxlc0ZvckxvY2F0aW9uVVJJKG5ldyBGaWxlKGZpbGVMb2NhdGlvbikudG9VUkkoKSk7DQotCQlpZiAoZmlsZXNGb3VuZCA9PSBudWxsIHx8IGZpbGVzRm91bmQubGVuZ3RoID09IDApIHsNCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGaWxlOiAiICsgZmlsZUxvY2F0aW9uICsgIiBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0NCi0JCUxpc3Q8SUNvbXBpbGF0aW9uVW5pdD4gdW5pdHMgPSBuZXcgQXJyYXlMaXN0PElDb21waWxhdGlvblVuaXQ+KCk7DQotDQotCQlmb3IgKElGaWxlIGZpbGUgOiBmaWxlc0ZvdW5kKSB7DQotCQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKGZpbGUpOw0KLQkJCWlmICghKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkpIHsNCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmlsZTogIiArIGZpbGVMb2NhdGlvbiArICIgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQl9DQotDQotCQkJdW5pdHMuYWRkKChJQ29tcGlsYXRpb25Vbml0KSBqYXZhRWxlbWVudCk7DQotCQl9DQotDQotCQlyZXR1cm4gdW5pdHM7DQotCX0NCi0JCQkNCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3RVbml0KFN0cmluZyBmaWxlTG9jYXRpb24pDQotCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQkNCi0JCWlmIChmaWxlTG9jYXRpb24gPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpbGVMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVMb2NhdGlvbikpOw0KLQkJaWYgKGZpbGUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGaWxlOiAiICsgZmlsZUxvY2F0aW9uICsgIiBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0NCi0JCXJldHVybiBmaWxlLmdldFByb2plY3QoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZpbGVEaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKGZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pDQotCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gaXNGaWxlRGlzcGxheWVkSW5EaXJ0eUVkaXRvcihnZXRFZGl0b3JzQnlGaWxlTG9jYXRpb24oZmlsZUxvY2F0aW9uKSk7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCkgew0KLQkJcmV0dXJuIGlzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KHVuaXQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzYXZlRWRpdG9yKFN0cmluZyBmaWxlTG9jYXRpb24pDQotCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlzYXZlRWRpdG9yKGZpbGVMb2NhdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2F2ZUVkaXRvcihmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uLA0KLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQlMaXN0PElFZGl0b3JQYXJ0PiBlZGl0b3JzID0gZ2V0RWRpdG9yc0J5RmlsZUxvY2F0aW9uKGZpbGVMb2NhdGlvbik7DQotCQlpZiAoZWRpdG9ycy5zaXplKCkgPT0gMCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBmaWxlIGlzIG5vdCBkaXNwbGF5ZWQgYnkgYW4gZWRpdG9yIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXNhdmVFZGl0b3JzKGVkaXRvcnMsIG1vbml0b3IpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNhdmVFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSwNCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCUxpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvcnMgPSBnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJaWYgKGVkaXRvcnMuc2l6ZSgpID09IDApIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvciIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlzYXZlRWRpdG9ycyhlZGl0b3JzLCBtb25pdG9yKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzYXZlRWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCUxpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvcnMgPSBnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJaWYgKGVkaXRvcnMuc2l6ZSgpID09IDApIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvciIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlzYXZlRWRpdG9ycyhlZGl0b3JzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgc2F2ZUVkaXRvcnMoZmluYWwgTGlzdDxJRWRpdG9yUGFydD4gZWRpdG9ycywNCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCWZvciAoSUVkaXRvclBhcnQgZSA6IGVkaXRvcnMpIHsNCi0JCQlpZiAoZS5pc0RpcnR5KCkpIHsNCi0JCQkJZS5kb1NhdmUobW9uaXRvcik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiBnZXREaXJ0eUVkaXRvcnMoKSB7DQotCQlmaW5hbCBTZXQ8SUVkaXRvcklucHV0PiBpbnB1dHMgPSBuZXcgSGFzaFNldDxJRWRpdG9ySW5wdXQ+KCk7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PigpOw0KLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOw0KLQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7DQotCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2VbXSBwYWdlcyA9IHdpbmRvd3NbaV0uZ2V0UGFnZXMoKTsNCi0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhZ2VzLmxlbmd0aDsgeCsrKSB7DQotCQkJCWZpbmFsIElFZGl0b3JQYXJ0W10gZWRpdG9ycyA9IHBhZ2VzW3hdLmdldERpcnR5RWRpdG9ycygpOw0KLQkJCQlmb3IgKGludCB6ID0gMDsgeiA8IGVkaXRvcnMubGVuZ3RoOyB6KyspIHsNCi0JCQkJCWZpbmFsIElFZGl0b3JQYXJ0IGVwID0gZWRpdG9yc1t6XTsNCi0JCQkJCWZpbmFsIElFZGl0b3JJbnB1dCBpbnB1dCA9IGVwLmdldEVkaXRvcklucHV0KCk7DQotCQkJCQlpZiAoIWlucHV0cy5jb250YWlucyhpbnB1dCkpIHsNCi0JCQkJCQlpbnB1dHMuYWRkKGlucHV0KTsNCi0JCQkJCQlyZXN1bHQuYWRkKGVwKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBJRWRpdG9yRGVzY3JpcHRvciBnZXRFZGl0b3JEZXNjcmlwdG9yKFN0cmluZyBmaWxlTmFtZSkgew0KLQkJSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KLQkJCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsNCi0JCXJldHVybiBlZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGVOYW1lKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29udmVydHMgYSBTdHJpbmcgdG8gYSBVUkwsIGFzc3VtaW5nICdmaWxlOicgYXMgYSBkZWZhdWx0IHNjaGVtZS4NCi0JICogDQotCSAqIEBwYXJhbSBiYXNlDQotCSAqIEBwYXJhbSBwYXRoDQotCSAqIA0KLQkgKiBAcmV0dXJuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uLA0KLQkgKiAgICAgICAgICAgICBpZiB0aGUgU3RyaW5nIGlzIG5laXRoZXIgYSB2YWxpZCBVUkwsIG5vciBhIHZhbGlkIGZpbGVuYW1lLg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBmaW5hbCBVUkwgZmlsZU9yVVJMVG9VUkwoZmluYWwgVVJMIGJhc2UsIGZpbmFsIFN0cmluZyBwYXRoKQ0KLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlpZiAocGF0aCA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXRoIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCVN0cmluZyBsb2NhbFBhdGggPSBwYXRoOw0KLQkJVVJMIGxvY2FsQmFzZSA9IGJhc2U7DQotDQotCQlpZiAobG9jYWxCYXNlID09IG51bGwpIHsNCi0JCQlsb2NhbEJhc2UgPSBuZXcgVVJMKCJmaWxlOiIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWxvY2FsUGF0aCA9IGxvY2FsUGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7DQotCQl0cnkgew0KLQkJCVN0cmluZyBwcm90b2NvbCA9IGxvY2FsQmFzZS5nZXRQcm90b2NvbCgpOw0KLQkJCWlmICghImh0dHAiLmVxdWFscyhwcm90b2NvbCkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJJiYgISJodHRwcyIuZXF1YWxzKHByb3RvY29sKSAvLyROT04tTkxTLTEkDQotCQkJCQkmJiAobG9jYWxQYXRoLmNoYXJBdCgxKSA9PSAnOicNCi0JCQkJCQkJfHwgbG9jYWxQYXRoLmNoYXJBdCgwKSA9PSAnLycgfHwgbG9jYWxQYXRoDQotCQkJCQkJCS5jaGFyQXQoMCkgPT0gJ1xcJykpIHsNCi0JCQkJbG9jYWxQYXRoID0gKG5ldyBGaWxlKGxvY2FsUGF0aCkpLnRvVVJJKCkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLQkJCS8vICRKTC1FWEMkDQotCQl9DQotDQotCQlpZiAobG9jYWxQYXRoLnN0YXJ0c1dpdGgoImZpbGU6IikgJiYgbG9jYWxQYXRoLmxlbmd0aCgpID4gNSAvLyROT04tTkxTLTEkDQotCQkJCSYmIGxvY2FsUGF0aC5jaGFyQXQoNSkgIT0gJy8nKSB7DQotCQkJbG9jYWxQYXRoID0gImZpbGU6LyIuY29uY2F0KGxvY2FsUGF0aC5zdWJzdHJpbmcoNSkpOyAvLyROT04tTkxTLTEkDQotCQl9IGVsc2Ugew0KLQkJCWlmIChsb2NhbFBhdGguc3RhcnRzV2l0aCgiZmlsZTovLyIpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCSYmICFsb2NhbFBhdGguc3RhcnRzV2l0aCgiZmlsZTovLy8vIikgLy8kTk9OLU5MUy0xJA0KLQkJCQkJJiYgIWxvY2FsUGF0aC5zdGFydHNXaXRoKCJmaWxlOi8vbG9jYWxob3N0LyIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJbG9jYWxQYXRoID0gImZpbGU6Ly8vLyIuY29uY2F0KGxvY2FsUGF0aC5zdWJzdHJpbmcoImZpbGU6Ly8iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCQkJCS5sZW5ndGgoKSkpOw0KLQkJCX0NCi0JCX0NCi0JCVVSTCB1cmwgPSBuZXcgVVJMKGxvY2FsQmFzZSwgbG9jYWxQYXRoKTsNCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0JcHVibGljIEZpbGUgY3JlYXRlVGVtcERpcmVjdG9yeSgpIHsNCi0JCVN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOyAvLyROT04tTkxTLTEkDQotCQlpbmRleCsrOw0KLQkJRmlsZSB0ZW1wMSA9IG5ldyBGaWxlKHRlbXBEaXIsIEludGVnZXIudG9TdHJpbmcodGhpcy5oYXNoQ29kZSgpKSArICJfIiAvLyROT04tTkxTLTEkDQotCQkJCSsgaW5kZXgpOw0KLQkJdGVtcDEubWtkaXIoKTsNCi0JCXJldHVybiB0ZW1wMTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoZmluYWwgRmlsZSBkaXJlY3RvcnkpIHsNCi0JCWlmIChkaXJlY3RvcnkgPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCWlmICghZGlyZWN0b3J5LmV4aXN0cygpKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJZm9yIChGaWxlIGYgOiBkaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsNCi0JCQlmLmRlbGV0ZSgpOw0KLQkJfQ0KLQkJZGlyZWN0b3J5LmRlbGV0ZSgpOw0KLQl9DQotDQotCXB1YmxpYyBJRmlsZVtdIGdldEZpbGVzQnlFeHRlbnNpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGV4dGVuc2lvbikNCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZXh0ZW5zaW9uLCAiZXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCUFycmF5TGlzdDxJRmlsZT4gZm91bmRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7DQotDQotCQlnZXRGaWxlc0J5RXh0ZW5zaW9uKGZvdW5kRmlsZXMsIHByb2plY3QubWVtYmVycygpLCBleHRlbnNpb24pOw0KLQ0KLQkJcmV0dXJuIGZvdW5kRmlsZXMudG9BcnJheShuZXcgSUZpbGVbZm91bmRGaWxlcy5zaXplKCldKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZ2V0RmlsZXNCeUV4dGVuc2lvbihBcnJheUxpc3Q8SUZpbGU+IGZvdW5kRmlsZXMsDQotCQkJSVJlc291cmNlW10gY3VycmVudFJlc291cmNlcywgU3RyaW5nIGV4dGVuc2lvbikNCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgY3VycmVudFJlc291cmNlcy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAoY3VycmVudFJlc291cmNlc1tpaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpIHsNCi0JCQkJZ2V0RmlsZXNCeUV4dGVuc2lvbihmb3VuZEZpbGVzLA0KLQkJCQkJCSgoSUZvbGRlcikgY3VycmVudFJlc291cmNlc1tpaV0pLm1lbWJlcnMoKSwgZXh0ZW5zaW9uKTsNCi0JCQl9IGVsc2UgaWYgKGN1cnJlbnRSZXNvdXJjZXNbaWldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRQ0KLQkJCQkJJiYgZXh0ZW5zaW9uDQotCQkJCQkJCS5lcXVhbHMoY3VycmVudFJlc291cmNlc1tpaV0uZ2V0RmlsZUV4dGVuc2lvbigpKSkgew0KLQkJCQlmb3VuZEZpbGVzLmFkZCgoSUZpbGUpIGN1cnJlbnRSZXNvdXJjZXNbaWldKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIElGaWxlIGdldEZpbGVGb3JMb2NhdGlvbihJUGF0aCBsb2NhdGlvbikgew0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKA0KLQkJCQlsb2NhdGlvbik7DQotCX0NCi0NCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVXb3JrYmVuY2hQYWdlKCkgew0KLQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkNCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTGlzdDxJRWRpdG9yUGFydD4gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShjdSwgImN1Iik7IC8vJE5PTi1OTFMtMSQNCi0JCWZpbmFsIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyID0gZ2V0RWRpdG9yRGVzY3JpcHRvcihjdQ0KLQkJCQkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlmaW5hbCBJV29ya2JlbmNoUGFnZSB3YlBhZ2UgPSBnZXRBY3RpdmVXb3JrYmVuY2hQYWdlKCk7DQotCQlpZiAod2JQYWdlID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oMCk7DQotCQl9DQotDQotCQlyZXR1cm4gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KGVkaXRvckRlc2NyLCB3YlBhZ2UsIGN1KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIExpc3Q8SUVkaXRvclBhcnQ+IGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdCgNCi0JCQlmaW5hbCBJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjcmlwdG9yLA0KLQkJCWZpbmFsIElXb3JrYmVuY2hQYWdlIHBhZ2UsIGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCUxpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvclBhcnRSZXR1cm5lZCA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KCk7DQotDQotCQlpZiAoZWRpdG9yRGVzY3JpcHRvciAhPSBudWxsICYmIHBhZ2UgIT0gbnVsbCkgew0KLQkJCWZvciAoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWZlcmVjZSA6IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpKSB7DQotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBlZGl0b3JSZWZlcmVjZS5nZXRFZGl0b3IodHJ1ZSk7DQotCQkJCWlmIChpc0VkaXRvckFwcGxpY2FibGVGb3JDdShlZGl0b3JQYXJ0LCBjdSkpIHsNCi0JCQkJCWVkaXRvclBhcnRSZXR1cm5lZC5hZGQoZWRpdG9yUGFydCk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZWRpdG9yUGFydFJldHVybmVkOw0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBpc0VkaXRvckFwcGxpY2FibGVGb3JDdShmaW5hbCBJRWRpdG9yUGFydCBlZGl0b3IsDQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgew0KLQkJaWYgKGVkaXRvciA9PSBudWxsKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKCEoZWRpdG9yLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQ0KLQkJCQl8fCAhKGN1LmdldFJlc291cmNlKCkgaW5zdGFuY2VvZiBJRmlsZSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlmaW5hbCBJRmlsZSBjdUZpbGUgPSAoSUZpbGUpIGN1LmdldFJlc291cmNlKCk7DQotCQlmaW5hbCBJRmlsZUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcg0KLQkJCQkuZ2V0RWRpdG9ySW5wdXQoKTsNCi0NCi0JCXJldHVybiBjdUZpbGUuZXF1YWxzKGVkaXRvcklucHV0LmdldEZpbGUoKSk7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaWxlRGlzcGxheWVkSW5EaXJ0eUVkaXRvcigNCi0JCQlmaW5hbCBMaXN0PElFZGl0b3JQYXJ0PiBkaXNwbGF5aW5nRWRpdG9ycykgew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGRpc3BsYXlpbmdFZGl0b3JzLCAiZGlzcGxheWluZ0VkaXRvcnMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZm9yIChJRWRpdG9yUGFydCBlZGl0b3IgOiBkaXNwbGF5aW5nRWRpdG9ycykgew0KLQkJCWlmIChlZGl0b3IuaXNEaXJ0eSgpKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVhZHMgZmlsZSBjb250ZW50IGFzIHRleHQgYW5kIHJldHVybnMge0BsaW5rIFN0cmluZ30NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VGaWxlDQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVDb250ZW50KGZpbmFsIEZpbGUgc291cmNlRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWZpbmFsIEZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihzb3VyY2VGaWxlKTsNCi0JCWZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIGNoYXJbXSBidWZmID0gbmV3IGNoYXJbMTAyNF07DQotCQkJZm9yIChpbnQgY250ID0gMDsgKGNudCA9IGZyLnJlYWQoYnVmZikpID4gLTE7KSB7DQotCQkJCWJ1aWxkZXIuYXBwZW5kKGJ1ZmYsIDAsIGNudCk7DQotCQkJfQ0KLQkJfSBmaW5hbGx5IHsNCi0JCQlmci5jbG9zZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50KGZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCwNCi0JCQlmaW5hbCBTdHJpbmcgY29udGVudCwgZmluYWwgYm9vbGVhbiBmb3JjZSwNCi0JCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHVuaXQsICJ1bml0Iik7IC8vJE5PTi1OTFMtMSQNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShjb250ZW50LCAiY29udGVudCIpOyAvLyROT04tTkxTLTEkDQotDQotCQl1bml0LmJlY29tZVdvcmtpbmdDb3B5KG1vbml0b3IpOw0KLQkJdHJ5IHsNCi0JCQl1bml0LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKGNvbnRlbnQpOw0KLQkJCXVuaXQuY29tbWl0V29ya2luZ0NvcHkoZm9yY2UsIG1vbml0b3IpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQl1bml0LmRpc2NhcmRXb3JraW5nQ29weSgpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCwgZmluYWwgU3RyaW5nIGNvbnRlbnQsDQotCQkJZmluYWwgYm9vbGVhbiBmb3JjZSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudCh1bml0LCBjb250ZW50LCBmb3JjZSwgbW9uaXRvcik7DQotCQlpZiAoaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKHVuaXQpKSB7DQotCQkJc2F2ZUVkaXRvcih1bml0KTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9JRmlsZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9JRmlsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZGZhMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvSUZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB0aGF0IGRlZmluZXMgY29tbW9uIHV0aWxpZXMgZm9yIGZpbGUgbWFuaXB1bGF0aW9uDQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlVXRpbHMgew0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHRoZSBlZGl0b3JzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZSBmaWxlIHNwZWNmaWVkLg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUNCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkNCi0JICogQHJldHVybiBDdXJyZW50IG9wZW5lZCBlZGl0b3JzIG9mIHRoZSBmaWxlIHNwZWNpZmllZCBvciBhbiBlbXB0eSBsaXN0IGlmIHN1Y2ggYXJlIG5vdCBvcGVuZWQNCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IExpc3Q8SUVkaXRvclBhcnQ+IGdldEVkaXRvcnNCeUZpbGVMb2NhdGlvbigNCi0JCQlmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWxlIHNwZWNpZmllZCBpcyBkaXNwbGF5ZWQgd2l0aGluIGFuIGVkaXRvciB3aGljaA0KLQkgKiBoYXMgYSBkaXJ0eSBzdGF0ZS4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlTG9jYXRpb24NCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlDQotCSAqIEBzZWUgSVJlc291cmNlI2dldExvY2F0aW9uKCkudG9PU1N0cmluZygpDQotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBpcyBkaXJ0eQ0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoDQotCQkJZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFNhdmVzIHRoZSBkaXJ0eSBzdGF0ZSBlZGl0b3INCi0JICogDQotCSAqIEBwYXJhbSBmaWxlTG9jYXRpb24NCi0JICogICAgICAgICAgICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlDQotCSAqIEBzZWUgSVJlc291cmNlI2dldExvY2F0aW9uKCkjdG9PU1N0cmluZygpDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoU3RyaW5nIGZpbGVMb2NhdGlvbikNCi0JCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2F2ZXMgdGhlIGRpcnR5IHN0YXRlIGVkaXRvcg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUNCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TG9jYXRpb24oKSN0b09TU3RyaW5nKCkNCi0JICogQHBhcmFtIG1vbml0b3INCi0JICogICAgICAgICAgICBQcm9ncmVzcyBtb25pdG9yDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoU3RyaW5nIGZpbGVMb2NhdGlvbiwNCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGRpcnR5IGVkaXRvcnMNCi0JICogDQotCSAqIEByZXR1cm4gY29sbGVjdGlvbiBjb250YWluaW5nIGRpcnR5IGVkaXRvcnMNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiBnZXREaXJ0eUVkaXRvcnMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIGNvbXBpbGF0aW9uIHVuaXRzIGZvciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZUxvY2F0aW9uDQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUsIGUuZy4NCi0JICogICAgICAgICAgICA8Y29kZT5DOlxcZGlyMVxcZGlyMlxcZmlsZS5uYW1lPC9jb2RlPg0KLQkgKiBAc2VlIElSZXNvdXJjZSNnZXRMb2NhdGlvbigpI3RvT1NTdHJpbmcoKQ0KLQkgKiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSB3b3Jrc3BhY2UNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gZmlsZUxvY2F0aW9uIGlzIG51bGwNCi0JICogQHJldHVybiBUaGUgY29tcGlsYXRpb24gdW5pdHM7IGNhbm5vdCBiZSBudWxsDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdDxJQ29tcGlsYXRpb25Vbml0PiBnZXRDb21waWxhdGlvblVuaXRzKA0KLQkJCWZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogUmV0cmlldmUgcHJvamVjdCB1bml0IGZvciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZUxvY2F0aW9uDQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUsIGUuZy4NCi0JICogICAgICAgICAgICA8Y29kZT5DOlxcZGlyMVxcZGlyMlxcZmlsZS5uYW1lPC9jb2RlPg0KLQkgKiBAc2VlIElSZXNvdXJjZSNnZXRMb2NhdGlvbigpI3RvT1NTdHJpbmcoKQ0KLQkgKiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSB3b3Jrc3BhY2UNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIGZpbGVMb2NhdGlvbiBpcyBudWxsDQotCSAqIEByZXR1cm4gVGhlIGNvbXBpbGF0aW9uIHVuaXRzOyBjYW5ub3QgYmUgbnVsbA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IElQcm9qZWN0IGdldFByb2plY3RVbml0KA0KLQkJCWZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBDb252ZXJ0cyBhIFN0cmluZyB0byBhIFVSTCwgYXNzdW1pbmcgJ2ZpbGU6JyBhcyBhIGRlZmF1bHQgc2NoZW1lLg0KLQkgKiANCi0JICogQHBhcmFtIGJhc2UNCi0JICogQHBhcmFtIHBhdGgNCi0JICogDQotCSAqIEByZXR1cm4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24sDQotCSAqICAgICAgICAgICAgIGlmIHRoZSBTdHJpbmcgaXMgbmVpdGhlciBhIHZhbGlkIFVSTCwgbm9yIGEgdmFsaWQgZmlsZW5hbWUuDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IFVSTCBmaWxlT3JVUkxUb1VSTChmaW5hbCBVUkwgYmFzZSwgZmluYWwgU3RyaW5nIHBhdGgpDQotCQkJdGhyb3dzIElPRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgaW4gdGhlIE9TIHRlbXAgZm9sZGVyDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBkaXJlY3RvcnkNCi0JICovDQotCXB1YmxpYyBGaWxlIGNyZWF0ZVRlbXBEaXJlY3RvcnkoKTsNCi0NCi0JLyoqDQotCSAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudA0KLQkgKiANCi0JICogcGFyYW0gZGlyZWN0b3J5DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoZmluYWwgRmlsZSBkaXJlY3RvcnkpOw0KLQ0KLQkvKioNCi0JICogR2V0cyBhbGwgdGhlIGZpbGVzIHdpdGggdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiB3aXRoaW4gYSBwcm9qZWN0Lg0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3QgLQ0KLQkgKiAgICAgICAgICAgIHRvIGJlIHNlYXJjaGVkDQotCSAqIEBwYXJhbSBleHRlbnNpb24gLQ0KLQkgKiAgICAgICAgICAgIHR5cGVzIG9mIGZpbGVzIG9mIGludGVyZXN0DQotCSAqLw0KLQlwdWJsaWMgSUZpbGVbXSBnZXRGaWxlc0J5RXh0ZW5zaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBleHRlbnNpb24pDQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGVkaXRvcnMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXlpbmcgdGhlIGNvbXBpbGF0aW9uDQotCSAqIHVuaXQgc3BlY2lmaWVkLg0KLQkgKiANCi0JICogQHBhcmFtIGN1DQotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQ7IG11c3Qgbm90IGJlIG51bGwNCi0JICogQHJldHVybiBDdXJyZW50IGVkaXRvcnMgbGlzdCBvciBhbiBlbXB0eSBsaXN0IGluIGNhc2UgdGhlcmUgYXJlIG5vdA0KLQkgKiAgICAgICAgIGVkaXRvcnMgZGlzcGxheWluZyB0aGUgZmlsZSBzcGVjaWZpZWQNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgPGNvZGU+Y3U8L2NvZGU+IHBhcmFtZXRlciBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdDxJRWRpdG9yUGFydD4gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpOw0KLQ0KLQkvKioNCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiB1bml0IHNwZWNpZmllZCBpcyBkaXNwbGF5ZWQgd2l0aGluIGFuDQotCSAqIGVkaXRvciB3aGljaCBoYXMgYSBkaXJ0eSBzdGF0ZS4NCi0JICogDQotCSAqIEBwYXJhbSB1bml0DQotCSAqICAgICAgICAgICAgVGhlIGNvbXBpbGF0aW9uIHVuaXQNCi0JICogDQotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyBkaXJ0eQ0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKA0KLQkJCWZpbmFsIElDb21waWxhdGlvblVuaXQgdW5pdCk7DQotDQotCS8qKg0KLQkgKiBTYXZlcyBhbGwgdGhlIGRpcnR5IHN0YXRlIGVkaXRvcnMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXlpbmcgdGhlDQotCSAqIGNvbXBpbGF0aW9uIHVuaXQgc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAcGFyYW0gY3UNCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIFByb2dyZXNzIG1vbml0b3INCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0DQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwNCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOw0KLQ0KLQkvKioNCi0JICogU2F2ZXMgYWxsIHRoZSBkaXJ0eSBzdGF0ZSBlZGl0b3JzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5aW5nIHRoZQ0KLQkgKiBjb21waWxhdGlvbiB1bml0IHNwZWNpZmllZA0KLQkgKiANCi0JICogQHBhcmFtIGN1DQotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQNCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0DQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3INCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNhdmVFZGl0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSk7DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSBhIGZpbGUgaW5zdGFuY2UgZm9yIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQuIFRoaXMgbWV0aG9kIGlzIGENCi0JICogY29udmVuaWVuY2UgbWV0aG9kIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcNCi0JICogPGNvZGU+UmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obG9jYXRpb24pPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIGxvY2F0aW9uDQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgbG9jYXRpb247IG11c3QgYmUgYWJzb2x1dGUNCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmaWxlIGluIHRoZSB3b3Jrc3BhY2UsIG9yIG51bGwgaWYgbm9uZQ0KLQkgKiBAc2VlIElXb3Jrc3BhY2VSb290I2dldEZpbGVGb3JMb2NhdGlvbihJUGF0aCkNCi0JICovDQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlRm9yTG9jYXRpb24oSVBhdGggbG9jYXRpb24pOw0KLQ0KLQkvKioNCi0JICogUmVhZHMgZmlsZSBjb250ZW50IGFzIHRleHQgYW5kIHJldHVybnMge0BsaW5rIFN0cmluZ30NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VGaWxlDQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVDb250ZW50KGZpbmFsIEZpbGUgc291cmNlRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBzcGVjaWZpZWQgd2l0aCB0aGUNCi0JICogPGNvZGU+Y29udGVudDwvY29kZT4gcHJvdmlkZWQuIFRoZXJlIGlzIG5vIHZhbGlkYXRpb24gb2YgdGhlIGNvbnRlbnQNCi0JICogDQotCSAqIEBwYXJhbSBjVW5pdA0KLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0LiBNdXN0IG5vdCBiZSBudWxsLiBJZiB0aGUgY29tcGlsYXRpb24NCi0JICogICAgICAgICAgICB1bml0IGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQNCi0JICogQHBhcmFtIGNvbnRlbnQNCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0byBiZSBzZXQuIE11c3Qgbm90IGJlIG51bGwNCi0JICogQHBhcmFtIGZvcmNlDQotCSAqICAgICAgICAgICAgYSBmbGFnIHRvIGhhbmRsZSB0aGUgY2FzZXMgd2hlbiB0aGUgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsDQotCSAqICAgICAgICAgICAgcmVzb3VyY2UgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkDQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqICAgICAgICAgICAgdGhlIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzIHRvIG9yIG51bGwgaWYgbm8gcHJvZ3Jlc3MNCi0JICogICAgICAgICAgICBtb25pdG9yaW5nIGlzIHJlcXVpcmVkDQotCSAqIA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHNldHRpbmcgY29tcGlsYXRpb24gdW5pdCBjb250ZW50DQotCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNiZWNvbWVXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjY29tbWl0V29ya2luZ0NvcHkoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2Rpc2NhcmRXb3JraW5nQ29weSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50KElDb21waWxhdGlvblVuaXQgY1VuaXQsDQotCQkJU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBzcGVjaWZpZWQgd2l0aCB0aGUNCi0JICogPGNvZGU+Y29udGVudDwvY29kZT4gcHJvdmlkZWQgYW5kIHNhdmVzIHRoZSBkaXJ0eSBlZGl0b3JzIGlmIGFueSB3aGljaA0KLQkgKiBkaXNwbGF5IHRoZSBjb21waWxhdGlvbiB1bml0LiBUaGVyZSBpcyBubyB2YWxpZGF0aW9uIG9mIHRoZSBjb250ZW50DQotCSAqIA0KLQkgKiBAcGFyYW0gY1VuaXQNCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdC4gTXVzdCBub3QgYmUgbnVsbC4gSWYgdGhlIGNvbXBpbGF0aW9uDQotCSAqICAgICAgICAgICAgdW5pdCBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkDQotCSAqIEBwYXJhbSBjb250ZW50DQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdG8gYmUgc2V0LiBNdXN0IG5vdCBiZSBudWxsDQotCSAqIEBwYXJhbSBmb3JjZQ0KLQkgKiAgICAgICAgICAgIGEgZmxhZyB0byBoYW5kbGUgdGhlIGNhc2VzIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbA0KLQkgKiAgICAgICAgICAgIHJlc291cmNlIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIHRoZSBtb25pdG9yIHRvIHJlcG9ydCBwcm9ncmVzcyB0byBvciBudWxsIGlmIG5vIHByb2dyZXNzDQotCSAqICAgICAgICAgICAgbW9uaXRvcmluZyBpcyByZXF1aXJlZA0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBzZXR0aW5nIGNvbXBpbGF0aW9uIHVuaXQgY29udGVudA0KLQkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjYmVjb21lV29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2NvbW1pdFdvcmtpbmdDb3B5KGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNkaXNjYXJkV29ya2luZ0NvcHkoKQ0KLQkgKiBAc2VlIElGaWxlVXRpbHMjc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChJQ29tcGlsYXRpb25Vbml0LCBTdHJpbmcsDQotCSAqICAgICAgYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJRmlsZVV0aWxzI2lzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoU3RyaW5nKQ0KLQkgKiBAc2VlIElGaWxlVXRpbHMjc2F2ZUVkaXRvcihJQ29tcGlsYXRpb25Vbml0LCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoDQotCQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsDQotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9Qcm9qZWN0TWFuYWdlbWVudFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9Qcm9qZWN0TWFuYWdlbWVudFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmODgwYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvUHJvamVjdE1hbmFnZW1lbnRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlczsNCi0NCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZXhjZXB0aW9uLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5GYWNldFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLklGYWNldFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgdGhhdCBwcm92aWRlcyB1c2VmdWwgcHJvamVjdCBtYW5hZ2VtZW50IHNlcnZpY2VzDQotICogDQotICogQGF1dGhvciBKb2VyZyBEZWhtZWwNCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9qZWN0TWFuYWdlbWVudFV0aWxzDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTG9nZ2VyIGxvZ2dlciA9IG5ldyBMb2dnZXIoKTsNCi0JDQotCS8qKg0KLQkgKiBQcm92aWRlcyB0aGUgbWV0YS1pbmYgZm9sZGVyIG9mIGEgRUpCIHByb2plY3QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcFByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgcHJvamVjdCBuYW1lDQotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIG9mIHRoZSBtZXRhLWluZiBmb2xkZXINCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiBwcm9qZWN0IG5hbWUgc3BlY2lmaWVkIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBlbXB0eSBzdHJpbmcsIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlLCBvciB0aGUgcHJvamVjdA0KLQkgKiAgICAgICAgICAgICBpcyBub3QgYW4gZWpiIHByb2plY3QNCi0JICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgZWl0aGVyIHRoZSBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBvciBpdCBkb2Vzbid0IGNvbnRhaW4gYSBtZXRhLWluZiBmb2xkZXINCi0JICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBhY2Nlc3NpbmcgamF2YSBtb2RlbA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJRm9sZGVyIGZpbmRNZXRhSW5mRm9sZGVyKGZpbmFsIFN0cmluZyBwUHJvamVjdE5hbWUpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIG1ldGFJbmZOYW1lID0gIk1FVEEtSU5GIjsgLy8kTk9OLU5MUy0xJA0KLQkJZmluYWwgU3RyaW5nIGVqYk1vZHVsZU5hbWUgPSAiZWpiTW9kdWxlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaWYgKCFpc0VqYjNQcm9qZWN0KHBQcm9qZWN0TmFtZSkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdCAiICsgcFByb2plY3ROYW1lICsgIiBpcyBub3QgYW4gRUpCIHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotDQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEJ5TmFtZShwUHJvamVjdE5hbWUpOw0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QocHJvamVjdCk7DQotCQlJUGFja2FnZUZyYWdtZW50IGVqYk1vZHVsZVBrZ0ZyYWdtZW50ID0gbnVsbDsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgZnJhZ21lbnRSb290IDogamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSkNCi0JCQl7DQotCQkJCWlmIChmcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFICYmIGZyYWdtZW50Um9vdC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhlamJNb2R1bGVOYW1lKSkNCi0JCQkJew0KLQkJCQkJZWpiTW9kdWxlUGtnRnJhZ21lbnQgPSBmcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KG1ldGFJbmZOYW1lKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQl2ZXJpZnlNZXRhSW5mRm9sZGVyKGVqYk1vZHVsZVBrZ0ZyYWdtZW50LCBwUHJvamVjdE5hbWUpOw0KLQkJCXJldHVybiAoSUZvbGRlcikgZWpiTW9kdWxlUGtnRnJhZ21lbnQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7DQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeU1ldGFJbmZGb2xkZXIoSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uDQotCXsNCi0JCWlmIChmcmFnbWVudCA9PSBudWxsKQ0KLQkJew0KLQkJCWZpbmFsIFN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgicHJvamVjdCB7MH0gZG9lcyBub3QgaGF2ZSBhIE1FVEEtSU5GIGZvbGRlciIsIG5ldyBPYmplY3RbXSB7IHByb2plY3ROYW1lIH0pOyAvLyROT04tTkxTLTEkDQotCQkJZmluYWwgU3RyaW5nIGxvY2FsaXplZE1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLlByb2plY3RNYW5hZ2VtZW50VXRpbHNfUHJvamVjdEhhc05vTWV0YUluZkZvbGRlck1zZywgbmV3IE9iamVjdFtdIHsgcHJvamVjdE5hbWUgfSk7DQotCQkJdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihtc2csIGxvY2FsaXplZE1zZyk7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmcmFnbWVudC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsNCi0JCQkvLyBzaG91bGQgbm90IGhhcHBlbiENCi0JCQlpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpKQ0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlc291cmNlICIgKyByZXNvdXJjZS5nZXROYW1lKCkgKyAiIGlzIG5vdCBhIGZvbGRlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQl9DQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2sgd2hldGhlciBhIHByb2plY3QgaXMgYW4gZWpiIDMgcHJvamVjdA0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Q7IGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBzdHJpbmcNCi0JICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgZWpiIDMgcHJvamVjdDsgZmFsc2Ugb3RoZXJ3aXNlDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpZWQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGVtcHR5IHN0cmluZw0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlDQotCSAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGFjY2Vzc2luZyB0aGUgcHJvamVjdCBtZXRhZGF0YQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWpiM1Byb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEJ5TmFtZShwcm9qZWN0TmFtZSk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlyZXR1cm4gZmFjZXRVdGlscygpLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgSUZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX1ZFUlNJT04sIElGYWNldFV0aWxzLkVKQl8zMF9GQUNFVF9JRCwgdHJ1ZSk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrIHdoZXRoZXIgYSBwcm9qZWN0IGlzIGFuIHdlYiAyLjUgcHJvamVjdA0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Q7IGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBzdHJpbmcNCi0JICogQHJldHVybiB0cnVlIGluIGNhc2UgdGhlIHByb2plY3Qgc3BlY2lmaWVkIGlzIGEgd2ViIDIuNSBwcm9qZWN0OyBmYWxzZSBvdGhlcndpc2UNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgcHJvamVjdCBuYW1lIHNwZWNpZmllZCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgZW1wdHkgc3RyaW5nDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGUNCi0JICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWNjZXNzaW5nIHRoZSBwcm9qZWN0IG1ldGFkYXRhDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXZWIyNVByb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEJ5TmFtZShwcm9qZWN0TmFtZSk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlyZXR1cm4gZmFjZXRVdGlscygpLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJvamVjdCwgSUZhY2V0VXRpbHMuV0VCXzI1X0ZBQ0VUX1ZFUlNJT04sIElGYWNldFV0aWxzLldFQl8yNV9GQUNFVF9JRCwgdHJ1ZSk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIHRoZSBwcm9qZWN0IGluc3RhbmNlIGJ5IHByb2plY3QgbmFtZQ0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgbmFtZQ0KLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGluc3RhbmNlDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpZWQgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZQ0KLQkgKiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdEJ5TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpDQotCXsNCi0JCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsIHx8IHByb2plY3ROYW1lLmxlbmd0aCgpID09IDApDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBwcm9qZWN0IG5hbWU6ICIgKyBwcm9qZWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOw0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc0FjY2Vzc2libGUoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9qZWN0IGlzIG5vdCBhY2Nlc3NpYmxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBwcm9qZWN0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXQgdGhlIGphdmEgcHJvamVjdCBpbnN0YW5jZQ0KLQkgKiANCi0JICogQHBhcmFtIHByb2plY3QNCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdCBhcyBlY2xpcHNlIHJlc291cmNlDQotCSAqIEByZXR1cm4gdGhlIGphdmEgcHJvamVjdCBpbnN0YW5jZQ0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IG51bGwgb3IgdGhlIHByb2plY3QgaXMgbm90IGFjY2Vzc2libGUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdCBpcyBub3QgYWNjZXNzaWJsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVmcmVzaCB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkLiBSZWZyZXNoIGRlcHRoIHVzZWQgaXMgemVybw0KLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIGJlIHJlZnJlc2hlZA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEBzZWUgSVJlc291cmNlI0RFUFRIX1pFUk8NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlpZihyZXNvdXJjZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicmVzb3VyY2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZWZyZXNoZXMgdGhlIHByb2plY3QgdGhlIHJlc291cmNlIHNwZWNpZmllZCBiZWxvbmdzIHRvLiBSZWZyZXNoIGRlcHRoIHVzZWQgaXMgaW5maW5pdGUuDQotCSAqIEBwYXJhbSB0aGUgcmVzb3VyY2Ugd2hpY2ggcHJvamVjdCBpcyB0byBiZSByZWZyZXNoZWQNCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHRoZSByZXNvdXJjZSBzcGVjaWZpZWQgaXMgYSB3b3Jrc3BhY2Ugcm9vdA0KLQkgKiBAc2VlIElSZXNvdXJjZSNERVBUSF9JTkZJTklURQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQcm9qZWN0QnlSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWlmKHJlc291cmNlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJyZXNvdXJjZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3BlcmF0aW9uIGlzIG5vdCBkZWZpbmVkIGZvciB3b3Jrc3BhY2Ugcm9vdHMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXNvdXJjZS5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIElGYWNldFV0aWxzIGZhY2V0VXRpbHMoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEZhY2V0VXRpbHMoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGM5NjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGNsYXNzIHRoYXQgdXNlcyBhIFN0cmluZ1JlYWRlciB0byBvcmdhbml6ZSBhbiBJbnB1dFN0cmVhbQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlciBleHRlbmRzIElucHV0U3RyZWFtDQotew0KLQlwcml2YXRlIFN0cmluZ1JlYWRlciByZWFkZXI7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHN0cmluZw0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+c3RyaW5nPC9jb2RlPiBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKFN0cmluZyBzdHJpbmcpDQotCXsNCi0JCWlmIChzdHJpbmcgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHN0cmluZyk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gcmVhZGVyLnJlYWQoKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNTlhM2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjgyNjQ2MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHM7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkNjkwZjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4NCi08dGl0bGU+QWJvdXQ8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFTi1VUyI+DQotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+DQotIA0KLTxwPlNlcHRlbWJlciAwNiwgMjAwOTwvcD4JDQotPGgzPkxpY2Vuc2U8L2gzPg0KLQ0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIA0KLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIA0KLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIA0KLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkNCi1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgDQotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQNCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9ib29rLmNzcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDdlMmI1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvYm9vay5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1AaW1wb3J0ICIuLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLXNwYW4uY29udHJvbCB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLm5hbWUgewotICBmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4uY29kZSB7Ci0gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci19Ci0KLXAubmF2X2Zvb3RlciB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXAubmF2X2Zvb3RlciBhIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhY2E0ZWE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBib29rLmNzcyxcCi0gICAgICAgICAgICAgICBjaGVhdHNoZWV0cy8sXAotICAgICAgICAgICAgICAgZ2V0dGluZ3N0YXJ0ZWQvLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGFza3MvLFwKLSAgICAgICAgICAgICAgIHRvY2dldHRpbmdzdGFydGVkLnhtbCxcCi0gICAgICAgICAgICAgICB0b2N0YXNrcy54bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UvLFwKLSAgICAgICAgICAgICAgIGxlZ2FsLmh0bWwsXAotICAgICAgICAgICAgICAgdG9jcmVmZXJlbmNlLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2JvdHRvbVVwLWN4Zi1jb21wb3NpdGUueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2JvdHRvbVVwLWN4Zi1jb21wb3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYWJlMTM5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9ib3R0b21VcC1jeGYtY29tcG9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9zaXRlQ2hlYXRzaGVldCBuYW1lPSJDcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRiI+Ci0gICA8dGFza0dyb3VwIGtpbmQ9InNldCIgbmFtZT0iQ3JlYXRpbmcgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEYiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxpbnRybz4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyB0byBzZXR1cCB0aGUgQXBhY2hlIENYRiBydW50aW1lLCBjcmVhdGUgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIsICBhIER5bmFtaWMgV2ViIFByb2plY3QgZW5hYmxlZCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgIGFuZCBjcmVhdGUgYSBKQVgtV1MgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiwgZGVwbG95IGl0IHRvIEFwYWNoZSBUb21jYXQgYW5kIHRlc3QgaXQgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4KLSAgICAgICAgIDxici8+Ci0gICAgICAgICA8YnIvPgotVG8gYXNzaXN0IHlvdSBhbG9uZyB0aGUgd2F5LCB3aXphcmRzIGFuZCBjb21tYW5kcyB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgeW91IHRvIGxhdW5jaCBhdXRvbWF0aWNhbGx5LgotICAgICAgPC9pbnRybz4KLSAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICBDb25ncmF0dWxhdGlvbnMhIFlvdSBqdXN0IGNvbmZpZ3VyZWQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSwgY3JlYXRlZCBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciwgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGVuYWJsZWQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BlbW50IGFuZCBhIEpBWC1XUyBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIGFuZCB0aGVuIGRlcGxveWVkIHRoYXQgc2VydmljZSB0byBBcGFjaGUgVG9tY2F0IGFuZCB0ZXN0ZWQgaXQgd2l0aCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyLgotICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICA8dGFzayBraW5kPSJjaGVhdHNoZWV0IiBuYW1lPSJJbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgUnVudGltZSIgc2tpcD0idHJ1ZSI+Ci0gICAgICAgICA8aW50cm8+Ci0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBydW50aW1lIGluIHRoZSB3b3JrYmVuY2guCi08YnIvPgotPGJyLz4KLUlmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgaW4gdGhlIHdvcmtiZW5jaCB5b3UgbWF5IHNraXAgdGhpcyB0YXNrIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtTa2lwIHRoaXMgdGFzayZxdW90OyBidXR0b24uCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGluc3RhbGxlZCBhbmQgY29uZmlndXJlZCB0aGUgQXBhY2hlIENYRiBydW50aW1lIQotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNvbmZpZ3VyZS1jeGYtcnVudGltZS54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9Ikluc3RhbGwgYW5kIGNyZWF0ZSBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciIgc2tpcD0idHJ1ZSI+Ci0gICAgICAgICA8aW50cm8+Ci0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGluc3RhbGwgYW5kIGNyZWF0ZSBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlci4KLTxici8+Ci08YnIvPgotSWYgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgYW5kIGNyZWF0ZWQgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIgeW91IG1heSBza2lwIHRoaXMgdGFzayBieSBjbGlja2luZyB0aGUgJnF1b3Q7U2tpcCB0aGlzIHRhc2smcXVvdDsgYnV0dG9uLgotICAgICAgICAgPC9pbnRybz4KLSAgICAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICAgICBDb25ncmF0dWxhdGlvbnMhICBZb3UganVzdCBpbnN0YWxsZWQgYW5kIGNyZWF0ZWQgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIhCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY3JlYXRlLXRvbWNhdC1zZXJ2ZXIueG1sIj4KLSAgICAgICAgIDwvcGFyYW0+Ci0gICAgICA8L3Rhc2s+Ci0gICAgICA8dGFzayBraW5kPSJjaGVhdHNoZWV0IiBuYW1lPSJDcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzIiBza2lwPSJ0cnVlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gY3JlYXRlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBhbmQgZW5hYmxlIGl0IGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wZW1udC4KLTxici8+Ci08YnIvPgotSWYgeW91IGFscmVhZHkgaGF2ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgIGVuYWJsZWQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IHlvdSBtYXkgc2tpcCB0aGlzIHRhc2sgYnkgY2xpY2tpbmcgdGhlICZxdW90O1NraXAgdGhpcyB0YXNrJnF1b3Q7IGJ1dHRvbi4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGp1c3QgY3JlYXRlZCBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZWQgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IQotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNyZWF0ZS1jeGYtcHJvamVjdC54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9IkNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRiIgc2tpcD0iZmFsc2UiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBjcmVhdGUgYSBKQVgtV1MgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBDWEYgcnVudGltZS4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGp1c3QgaWNyZWF0ZWQgYSBKQVgtV1MgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIENYRiBydW50aW1lIQotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNyZWF0ZS1ib3R0b21VcC1jeGYueG1sIj4KLSAgICAgICAgIDwvcGFyYW0+Ci0gICAgICA8L3Rhc2s+Ci0gICA8L3Rhc2tHcm91cD4KLTwvY29tcG9zaXRlQ2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jb25maWd1cmUtY3hmLXJ1bnRpbWUueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NvbmZpZ3VyZS1jeGYtcnVudGltZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzMDA4NWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NvbmZpZ3VyZS1jeGYtcnVudGltZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjaGVhdHNoZWV0IHRpdGxlPSJDb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgUnVudGltZSI+DQotICAgPGludHJvDQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBpbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBpbiB0aGUgd29ya2JlbmNoLgotICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgIDxici8+Ci1JZiB5b3UgbmVlZCBoZWxwIGF0IGFueSBzdGVwLCBjbGljayB0aGUgaGVscCBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgKD8pLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgPC9pbnRybz4NCi0gICA8aXRlbQ0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcmVxdWlyZW1lbnRzLmh0bWwiDQotICAgICAgICAgc2tpcD0idHJ1ZSINCi0gICAgICAgICB0aXRsZT0iRG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIEFwYWNoZSBDWEYgcnVudGltZSI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgIERvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgdmVyc2lvbiAyLjEueCBvciAyLjIueCBmcm9tIHRoZSBmb2xsb3dpbmcgc2l0ZTogaHR0cDovL2N4Zi5hcGFjaGUub3JnLy4gU2VsZWN0aW5nICB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gYmVsb3cgd2lsbCBvcGVuIGEgd2ViIGJyb3dzZXIgYXQgdGhhdCBsb2NhdGlvbi4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxjb21tYW5kDQotICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIg0KLSAgICAgICAgICAgIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIub3BlbkJyb3dzZXIodXJsPWh0dHA6Ly9jeGYuYXBhY2hlLm9yZy8pIi8+DQotICAgPC9pdGVtPg0KLSAgIDxpdGVtDQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3ByZWZlcmVuY2VzLmh0bWwiDQotICAgICAgICAgc2tpcD0idHJ1ZSINCi0gICAgICAgICB0aXRsZT0iQ29uZmlndXJlIEFwYWNoZSBDWEYgaW4gdGhlIHdvcmtiZW5jaCINCi0gICAgICAgICBkaWFsb2c9InRydWUiPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICBBcGFjaGUgQ1hGIG11c3QgYmUgY29uZmlndXJlZCBpbiB0aGUgd29ya2JlbmNoIGJlZm9yZSB1c2luZyBpdCB0byBjcmVhdGUgSkFYLVdTIFdlYiBzZXJ2aWNlcy4KLTxici8+Ci08YnIvPgotU2VsZWN0IDxiPldpbmRvdy0mZ3Q7UHJlZmVyZW5jZXM8L2I+IGZyb20gdGhlIG1haW4gbWVudSwgZXhwYW5kIHRoZSA8Yj5XZWIgU2VydmljZXM8L2I+IG91dGxpbmUgdHJlZSBub2RlIHdpdGhpbiB0aGUgcmVzdWx0aW5nIGRpYWxvZywgYW5kIGNob29zZSA8Yj5DWEYgMi54IFByZWZlcmVuY2VzPC9iPi4gU2VsZWN0IHRoZSAmcXVvdDtDbGljayB0byBwZXJmb3JtJnF1b3Q7IGJ1dHRvbiB0byBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuCi08YnIvPgotPGJyLz4KLUJyb3dzZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgeW91IGluc3RhbGxlZCBBcGFjaGUgIENYRiBhbmQgdGhlbiBjbGljayA8Yj5PSzwvYj4gaW4gdGhlIFByZWZlcmVuY2VzIGRpYWxvZy4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxjb21tYW5kDQotICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIg0KLSAgICAgICAgICAgIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5wcmVmZXJlbmNlcyhwcmVmZXJlbmNlUGFnZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSkiLz4NCi0gICA8L2l0ZW0+DQotICAgPGl0ZW0NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2Uvc2VydmVyX3J1bnRpbWUuaHRtbCINCi0gICAgICAgICBza2lwPSJ0cnVlIg0KLSAgICAgICAgIHRpdGxlPSJTZXQgQXBhY2hlIENYRiBhcyB0aGUgZGVmYXVsdCBydW50aW1lIg0KLSAgICAgICAgIGRpYWxvZz0idHJ1ZSI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgIFRvIHNldCBBcGFjaGUgQ1hGIGFzIHRoZSBkZWZhdWx0IFdlYiBzZXJ2aWNlIHJ1bnRpbWUgaW4gdGhlIHdvcmtiZW5jaCBzZWxlY3QgPGI+V2luZG93LSZndDtQcmVmZXJlbmNlczwvYj4gZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlIDxiPldlYiBTZXJ2aWNlczwvYj4gb3V0bGluZSB0cmVlIG5vZGUgd2l0aGluIHRoZSByZXN1bHRpbmcgZGlhbG9nLCBhbmQgY2hvb3NlIDxiPlNlcnZlciBhbmQgUnVudGltZTwvYj4uIFNlbGVjdGluZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gd2lsbCBvcGVuIHRoaXMgcHJlZmVyZW5jZSBwYWdlLgotPGJyLz4KLTxici8+Ci1JbiB0aGUgPGI+V2ViIHNlcnZpY2UgcnVudGltZTwvYj4gZHJvcCBkb3duIGxpc3Qgc2VsZWN0ICZxdW90O0FwYWNoZSBDWEYgMi54JnF1b3Q7IGFuZCBjbGljayA8Yj5PSzwvYj4uDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8Y29tbWFuZA0KLSAgICAgICAgICAgIHJlcXVpcmVkPSJmYWxzZSINCi0gICAgICAgICAgICBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS51aS53aW5kb3cucHJlZmVyZW5jZXMocHJlZmVyZW5jZVBhZ2VJZD1vcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuU2VydmVyUnVudGltZVByZWZlcmVuY2VQYWdlKSIvPg0KLSAgIDwvaXRlbT4KLTwvY2hlYXRzaGVldD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLWJvdHRvbVVwLWN4Zi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLWJvdHRvbVVwLWN4Zi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhYWNhNTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS1ib3R0b21VcC1jeGYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBXZWIgU2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEYiPgotICAgPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIHVzZSB0aGUgV2ViIFNlcnZpY2VzIHdpemFyZCB0byBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgYW5kIHRvIGRlcGxveSB0aGF0IHNlcnZpY2UgdG8gYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIgYW5kIHRlc3QgaXQgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4KLSAgICAgICAgIDxici8+Ci0gICAgICAgICA8YnIvPgotSWYgeW91IG5lZWQgaGVscCBhdCBhbnkgc3RlcCwgY2xpY2sgdGhlIGhlbHAgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyICg/KS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2ludHJvPgotICAgPGl0ZW0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIvZ2V0dGluZ1N0YXJ0ZWQvcXMtOS5odG0iCi0gICAgICAgICB0aXRsZT0iQ3JlYXRlIG9yIEltcG9ydCBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBDcmVhdGUgb3IgaW1wb3J0IGEgSmF2YSBiZWFuIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBpbnRvIHRoZSBzb3VyY2UgZm9sZGVyIG9mIGEgRHluYW1pYyBXZWIgUHJvamVjdCB0aGF0IGhhcyBiZWVuIGVuYWJsZWQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBkaWFsb2c9InRydWUiCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCIKLSAgICAgICAgIHRpdGxlPSJDcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRvIGNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iU2VsZWN0ICZxdW90O0ZpbGUgLSZndDsgTmV3IC0mZ3Q7IE90aGVyLi4uJnF1b3Q7IGZyb20gdGhlIG1haW4gbWVudSwgZXhwYW5kIHRoZSAmcXVvdDtXZWIgU2VydmljZXMmcXVvdDsgY2F0ZWdvcnkgYW5kIHNlbGVjdCAmcXVvdDtXZWIgU2VydmljZSZxdW90Oy4gQ2xpY2sgJnF1b3Q7T0smcXVvdDsgdG8gbGF1bmNoIHRoZSBXZWIgU2VydmljZXMgd2l6YXJkIG9yIHNlbGVjdCB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gdG8gZG8gdGhpcyBhdXRvbWF0aWNhbGx5LiI+Ci0gICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkKSIvPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgJnF1b3Q7Qm90dG9tIHVwIEphdmEgYmVhbiBXZWIgU2VydmljZSZxdW90OyBhcyB0aGUgJnF1b3Q7V2ViIHNlcnZpY2UgdHlwZSZxdW90Oy4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJCcm93c2UgdG8gc2VsZWN0IHRoZSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uLiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IlZlcmlmeSB0aGF0ICZxdW90O0FwYWNoZSBDWEYgMi54JnF1b3Q7IGlzIHNlbGVjdGVkIGFzIHRoZSBXZWIgc2VydmljZSBydW50aW1lLiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9Ik1vdmUgdGhlIHNlcnZpY2Ugc2xpZGVyIHRvIHRoZSAmcXVvdDtUZXN0IHNlcnZpY2UmcXVvdDsgc3RhZ2UuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iQWNjZXB0IGFsbCBvdGhlciBkZWZhdWx0IHZhbHVlcyBvbiB0aGlzIHBhZ2UgYW5kIGNsaWNrICZxdW90O05leHQgJmd0OyZxdW90Oy4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJPbiB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBwYWdlIHNlbGVjdCB0aGUgJnF1b3Q7VXNlIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UmcXVvdDsgY2hlY2sgYm94IGZvbGxvd2VkIGJ5IHRoZSAmcXVvdDtDcmVhdGUgYW4gU0VJJnF1b3Q7IGJ1dHRvbi4gRW50ZXIgYSBuYW1lIGZvciB0aGUgU0VJLCAmcXVvdDtTZWxlY3QgQWxsJnF1b3Q7IHRoZSBtZXRob2RzIGFuZCBjbGljayAmcXVvdDtGaW5pc2gmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R0ZXN0d3NkbC5odG1sIgotICAgICAgICAgc2tpcD0idHJ1ZSIKLSAgICAgICAgIHRpdGxlPSJUZXN0IHRoZSBXZWIgc2VydmljZSB3aXRoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVGhlIFdlYiBTZXJ2aWNlcyBXaXphcmQgd2lsbCBsYXVuY2ggdGhlIDxiPldlYiBTZXJ2aWNlcyBFeHBsb3JlcjwvYj4gYWZ0ZXIgc3VjY2Vzc2Z1bGx5IGNyZWF0aW5nIGFuZCBkZXBsb3lpbmcgeW91ciBXZWIgc2VydmljZSB0byBBcGFjaGUgVG9tY2F0LgotPGJyLz4KLTxici8+Ci1UbyB0ZXN0IHRoZSBXZWIgc2VydmljZSBzZWxlY3QgYW4gb3BlcnRhaW9uIGluIHRoZSA8Yj5XZWIgU2VydmljZXMgRXhwbG9yZXI8L2I+LCBmaWxsIGluIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBhbmQgY2xpY2sgPGI+R288L2I+LgotPGJyLz4KLTxici8+Ci1UaGUgcmVzdWx0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSA8Yj5TdGF0dXM8L2I+IHBhbmUuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICA8b25Db21wbGV0aW9uPgotICAgICBDb25ncmF0dWxhdGlvbnMhICBZb3UganVzdCBjcmVhdGVkIGEgSkFYLVdTIFdlYiBzZXJ2aWNlIQotICA8L29uQ29tcGxldGlvbj4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtY2xpZW50LWN4Zi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLWNsaWVudC1jeGYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOTY4YzE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtY2xpZW50LWN4Zi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQKLSAgICAgIHRpdGxlPSJHZW5lcmF0ZSBhIEpBWC1XUyBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRiI+Ci0gICA8aW50cm8KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZ3VpZGUgeW91IHRocm91Z2ggdGhlIGluZGl2aWR1YWwgc3RlcHMgdG8gZ2VuZXJhdGUgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pbnRybz4KLSAgIDxpdGVtCi0gICAgICAgICBkaWFsb2c9InRydWUiCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY2xpZW50Lmh0bWwiCi0gICAgICAgICB0aXRsZT0iR2VuZXJhdGUgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50Ij4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRvIGdlbmVyYXRlIGEgSkFYLVdTIGNsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHMuCi0gICAgICAgICAKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8c3ViaXRlbSBsYWJlbD0iU2VsZWN0ICZxdW90O0ZpbGUgLSZndDsgTmV3IC0mZ3Q7IE90aGVyLi4uJnF1b3Q7IGZyb20gdGhlIG1haW4gbWVudSwgZXhwYW5kIHRoZSAmcXVvdDtXZWIgU2VydmljZXMmcXVvdDsgY2F0ZWdvcnkgYW5kIGNob29zZSAmcXVvdDtXZWIgU2VydmljZSBDbGllbnQmcXVvdDsuIENsaWNrICZxdW90O09LJnF1b3Q7LiBTZWxlY3QgdGhlICZxdW90O0NsaWNrIHRvIHBlcmZvcm0mcXVvdDsgYnV0dG9uIGJlbG93IHRvIGRvIHRoaXMgYXV0b21hdGljYWxseS4iPgotICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZChuZXdXaXphcmRJZD1vcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQpIi8+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IkVudGVyIHRoZSBVUkkgdG8gdGhlIHJlbW90ZSBXU0RMIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsaWVudC4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgJnF1b3Q7SmF2YSBQcm94eSZxdW90OyBhcyB0aGUgJnF1b3Q7Q2xpZW50IHR5cGUmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iVmVyaWZ5IHRoYXQgJnF1b3Q7QXBhY2hlIENYRiAyLngmcXVvdDsgaXMgc2VsZWN0ZWQgYXMgdGhlICZxdW90O1dlYiBzZXJ2aWNlIHJ1bnRpbWUmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iU2VsZWN0IHRoZSAmcXVvdDtDbGllbnQgcHJvamVjdCZxdW90OyBsaW5rIHRvIGNob29zZSB0aGUgcHJvamVjdCBpbiB0byB3aGljaCB0aGUgSkFYLVdTIGNsaWVudCB3aWxsIGJlIGdlbmVyYXRlZC4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJNb3ZlIHRoZSBjbGllbnQgc2xpZGVyIHBvc2l0aW9uIHRvICZxdW90O0RldmVsb3AgQ2xpZW50JnF1b3Q7IGFuZCBjbGljayAmcXVvdDtGaW5pc2gmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuamR0LmRvYy51c2VyL2dldHRpbmdTdGFydGVkL3FzLTEyLmh0bSIKLSAgICAgICAgIHRpdGxlPSJSdW4gdGhlIEpBWC1XUyBjbGllbnQiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgQmVmb3JlIHJ1bm5pbmcgdGhlIGNsaWVudCBjaGVjayB0aGUgb3BlcmF0aW9uIHBhcmFtZXRlcnMgdGhhdCBDWEYgZ2VuZXJhdGVkIGZvciB5b3UgYW5kIGVkaXQgaWYgbmVjZXNzYXJ5LgotPGJyLz4KLTxici8+Ci1UbyA8Yj5ydW48L2I+IHlvdXIgY2xpZW50LCByaWdodC1jbGljayBvbiB0aGUgY2xpZW50IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCBzZWxlY3QgPGI+UnVuIEFzICZndDsgSmF2YSBBcHBsaWNhdGlvbjwvYj4uIEEgbmV3IGNvbnNvbGUgdmlldyB3aWxsIG9wZW4gYW5kIGRpc3BsYXkgdGhlIHJlc3BvbnNlcyBvZiB0aGUgb3BlcmF0aW9uIGludm9jYXRpb25zLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtY3hmLXByb2plY3QueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS1jeGYtcHJvamVjdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyMzA1ZjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS1jeGYtcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzIj4NCi0gICA8aW50cm8NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQ1hGIEpBWC1XUyBXZWIgc2VydmljZSBkZXZlbG9wbWVudC4KLSAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICA8YnIvPgotSWYgeW91IG5lZWQgaGVscCBhdCBhbnkgc3RlcCwgY2xpY2sgdGhlIGhlbHAgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyICg/KS4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgIDwvaW50cm8+DQotICAgPGl0ZW0NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL2NqcGVycy5odG1sIg0KLSAgICAgICAgIHNraXA9InRydWUiDQotICAgICAgICAgdGl0bGU9Ik9wZW4gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUiPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICBXaGVuIHdvcmtpbmcgd2l0aCBKQVgtV1MgV2ViIHNlcnZpY2VzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZS4gSWYgeW91IGFscmVhZHkgaGF2ZSB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSBhY3RpdmUsIHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlIDxiPkNsaWNrIHRvIFNraXA8L2I+IGJ1dHRvbi4gSWYgbm90LCBzZWxlY3QgPGI+V2luZG93IC0mZ3Q7IE9wZW4gUGVyc3BlY3RpdmUgLSZndDsgT3RoZXIuLi48L2I+IGZyb20gdGhlIG1haW4gbWVudSBhbmQgIGNob29zZSA8Yj5KYXZhIEVFPC9iPiBpbiB0aGUgcmVzdWx0aW5nIDxiPk9wZW4gUGVyc3BlY3RpdmU8L2I+IGRpYWxvZyBib3guDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8Y29tbWFuZA0KLSAgICAgICAgICAgIHJlcXVpcmVkPSJmYWxzZSINCi0gICAgICAgICAgICBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMuc2hvd1BlcnNwZWN0aXZlKG9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUucGVyc3BlY3RpdmVJZD1vcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUpIi8+DQotICAgPC9pdGVtPg0KLSAgIDxpdGVtDQotICAgICAgICAgZGlhbG9nPSJ0cnVlIg0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIg0KLSAgICAgICAgIHNraXA9InRydWUiDQotICAgICAgICAgdGl0bGU9IkNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QiPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICBCZWZvcmUgY3JlYXRpbmcgYSBKQVgtV1MgV2ViIFNlcnZpY2UsIHdlIG5lZWQgYSBwcm9qZWN0IHRvIHB1dCBpdCBpbi4gUGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGNyZWF0ZSBhbiBEeW5hbWljIFdlYiBQcm9qZWN0LgotPGJyLz4KLTxici8+Ci1TZWxlY3QgPGI+RmlsZSAtJmd0OyBOZXcgLSZndDsgUHJvamVjdC4uLjwvYj4gZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlIDxiPldlYjwvYj4gY2F0ZWdvcnkgd2l0aGluIHRoZSByZXN1bHRpbmcgPGI+TmV3IFByb2plY3Q8L2I+IGRpYWxvZyBib3ggYW5kIGNob29zZSA8Yj5EeW5hbWljIFdlYiBQcm9qZWN0PC9iPi4KLTxici8+Ci08YnIvPgotT24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZCBlbnRlciBhIDxiPlByb2plY3QgbmFtZTo8L2I+LCBzZWxlY3QgQXBhY2hlIFRvbWNhdCBhcyB0aGUgPGI+VGFyZ2V0IHJ1bnRpbWU8L2I+IGFuZCBjbGljayA8Yj5GaW5pc2g8L2I+Lg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiDQotICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViUHJvamVjdFdpemFyZCkiLz4NCi0gICA8L2l0ZW0+DQotICAgPGl0ZW0NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbnN0YWxsX2N4Zl9mYWNldC5odG1sIg0KLSAgICAgICAgIHNraXA9InRydWUiDQotICAgICAgICAgdGl0bGU9IkVuYWJsZSBKQVgtV1MgV2ViIHNlcnZpY2UgZGV2ZWxvcGVtZW50Ij4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgRW5hYmxlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgYnkgcmlnaHQtY2xpY2tpbmcgb24gdGhlIHByb2plY3QgYW5kIHNlbGVjdGluZyA8Yj5Qcm9wZXJ0aWVzPC9iPi4KLTxici8+Ci08YnIvPgotSW4gdGhlIDxiPlByb2plY3QgRmFjZXRzPC9iPiBwYWdlIGVuYWJsZSB0aGUgPGI+Q1hGIDIueCBXZWIgU2VydmljZXM8L2I+IGZhY2V0IGJ5IHNlbGVjdGluZyB0aGUgY2hlY2sgYm94IGFuZCBjbGljayA8Yj5PSzwvYj4uDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS10b21jYXQtc2VydmVyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtdG9tY2F0LXNlcnZlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzZjJkZDEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS10b21jYXQtc2VydmVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciI+DQotICAgPGludHJvDQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBpbnN0YWxsIGFuZCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIEFwYWNoZSBUb21jYXQgc2VydmVyIGluIG9yZGVyIHRvIGRlcGxveSBhbmQgdGVzdCB5b3VyIEpBWC1XUyBXZWIgc2VydmljZS4KLSAgICAgICAgICAgIDxici8+Ci0gICAgICAgICAgICA8YnIvPgotSWYgeW91IG5lZWQgaGVscCBhdCBhbnkgc3RlcCwgY2xpY2sgdGhlIGhlbHAgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyICg/KS4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgIDwvaW50cm8+DQotICAgPGl0ZW0NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5kb2MudXNlci90b3BpY3MvdG9tY2F0Lmh0bWwiDQotICAgICAgICAgc2tpcD0idHJ1ZSINCi0gICAgICAgICB0aXRsZT0iRG93bmxvYWQgYW5kIGluc3RhbGwgQXBhY2hlIFRvbWNhdCI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgIERvd25sb2FkIGFuZCBpbnN0YWxsIEFwYWNoZSBUb21jYXQgdmVyc2lvbiA1LjUueCBvciA2LjAueCBmcm9tIHRoZSBmb2xsb3dpbmcgc2l0ZTogaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnLy4gU2VsZWN0aW5nICB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gYmVsb3cgd2lsbCBvcGVuIGEgd2ViIGJyb3dzZXIgYXQgdGhhdCBsb2NhdGlvbi4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxjb21tYW5kDQotICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIg0KLSAgICAgICAgICAgIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIub3BlbkJyb3dzZXIodXJsPWh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy8pIi8+DQotICAgPC9pdGVtPg0KLSAgIDxpdGVtDQotICAgICAgICAgZGlhbG9nPSJ0cnVlIg0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmRvYy51c2VyL3RvcGljcy90b21jYXQuaHRtbCINCi0gICAgICAgICBza2lwPSJmYWxzZSINCi0gICAgICAgICB0aXRsZT0iQ3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIj4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgUGVyZm9ybSB0aGUgZm9sbG93aW5nIHRoZSBzdGVwcyB0byBjcmVhdGUgYSBUb21jYXQgc2VydmVyIGluIHRoZSB3b3JrYmVuY2guDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8c3ViaXRlbQ0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgJnF1b3Q7RmlsZSAtJmd0OyBOZXcgLSZndDsgT3RoZXIuLi4mcXVvdDsgZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlICZxdW90O1NlcnZlciZxdW90OyBjYXRlZ29yeSB3aXRoaW4gdGhlIHJlc3VsdGluZyAmcXVvdDtOZXcgV2l6YXJkJnF1b3Q7IGRpYWxvZyBib3ggYW5kIGNob29zZSAmcXVvdDtTZXJ2ZXImcXVvdDsuIENsaWNrICZxdW90O05leHQgJmd0OyZxdW90Oy4iDQotICAgICAgICAgICAgc2tpcD0idHJ1ZSI+DQotICAgICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiDQotICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkubmV3LnNlcnZlcikiLz4NCi0gICAgICA8L3N1Yml0ZW0+DQotICAgICAgPHN1Yml0ZW0NCi0gICAgICAgICAgICBsYWJlbD0iU2VsZWN0IHRoZSB2ZXJzaW9uIG9mIFRvbWNhdCB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZCBvbiB0aGUgZmlyc3QgcGFnZS4gQ2xpY2sgJnF1b3Q7TmV4dCAmZ3Q7JnF1b3Q7LiINCi0gICAgICAgICAgICBza2lwPSJ0cnVlIj4NCi0gICAgICA8L3N1Yml0ZW0+DQotICAgICAgPHN1Yml0ZW0NCi0gICAgICAgICAgICBsYWJlbD0iU3BlY2lmeSB0aGUgVG9tY2F0IEluc3RhbGxhdGlvbiBkaXJlY3RvcnkgYW5kIGNsaWNrICZxdW90O0ZpbmlzaCZxdW90Oy4iDQotICAgICAgICAgICAgc2tpcD0idHJ1ZSI+DQotICAgICAgPC9zdWJpdGVtPg0KLSAgICAgIDxzdWJpdGVtDQotICAgICAgICAgICAgbGFiZWw9Ik9wZW4gdGhlIFNlcnZlcnMgdmlldyBieSBzZWxlY3RpbmcgJnF1b3Q7V2luZG93IC0mZ3Q7IFNob3cgVmlldyAtJmd0OyBPdGhlci4uJnF1b3Q7IGZyb20gdGhlIG1haW4gbWVudSwgZXhwYW5kIHRoZSAmcXVvdDtTZXJ2ZXImcXVvdDsgY2F0ZWdvcnkgd2l0aGluIHRoZSByZXN1bHRpbmcgJnF1b3Q7U2hvdyBWaWV3JnF1b3Q7IGRpYWxvZyBib3ggYW5kIGNob29zZSAmcXVvdDtTZXJ2ZXJzJnF1b3Q7LiBDbGljayAmcXVvdDtPSyZxdW90Oy4iDQotICAgICAgICAgICAgc2tpcD0idHJ1ZSI+DQotICAgICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiDQotICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkudmlld3Muc2hvd1ZpZXcob3JnLmVjbGlwc2UudWkudmlld3Muc2hvd1ZpZXcudmlld0lkPW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXcpIi8+DQotICAgICAgPC9zdWJpdGVtPg0KLSAgICAgIDxzdWJpdGVtDQotICAgICAgICAgICAgbGFiZWw9IlN0YXJ0IHRoZSBUb21jYXQgc2VydmVyIGJ5IHNlbGVjdGluZyB0aGUgc2VydmVyIGluIHRoZSBTZXJ2ZXJzIHZpZXcgYW5kIGNsaWNraW5nIHRoZSAmcXVvdDtTdGFydCB0aGUgc2VydmVyJnF1b3Q7IGJ1dHRvbiBpbiB0aGUgU2VydmVycyB2aWV3IHRvb2xiYXIuIj4NCi0gICAgICA8L3N1Yml0ZW0+DQotICAgPC9pdGVtPgotPC9jaGVhdHNoZWV0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtdG9wRG93bi1jeGYueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS10b3BEb3duLWN4Zi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5NWY4MmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS10b3BEb3duLWN4Zi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQKLSAgICAgIHRpdGxlPSJHZW5lcmF0ZSBhIEpBWC1XUyBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGIj4KLSAgIDxpbnRybwotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIHRoZSBXZWIgU2VydmljZXMgd2l6YXJkIHRvIGdlbmVyYXRlIGEgSkFYLVdTIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZSBDWEYgcnVudGltZS4KLSAgICAgICAgIDxici8+Ci0gICAgICAgICA8YnIvPgotSWYgeW91IG5lZWQgaGVscCBhdCBhbnkgc3RlcCwgY2xpY2sgdGhlIGhlbHAgYnV0dG9uIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyICg/KS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2ludHJvPgotICAgPGl0ZW0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotICAgICAgICAgdGl0bGU9IkNyZWF0ZSBvciBpbXBvcnQgYSBXU0RMIGRvY3VtZW50Ij4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIENyZWF0ZSBvciBpbXBvcnQgYSBXU0RMIGZpbGUgaW50byB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIG9mIHRoZSBXZWIgcHJvamVjdC4gVGhlIFdTREwgZG9jdW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgc2VydmljZSBlbGVtZW50LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtCi0gICAgICAgICBkaWFsb2c9InRydWUiCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfdG9wZG93bi5odG1sIgotICAgICAgICAgdGl0bGU9IkdlbmVyYXRlIGEgSkFYLVdTIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gdGhlIFdTREwgZG9jdW1lbnQiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVG8gZ2VuZXJhdGUgYSBKQVgtV1MgU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iU2VsZWN0ICZxdW90O0ZpbGUgLSZndDsgTmV3IC0mZ3Q7IE90aGVyLi4uJnF1b3Q7IGZyb20gdGhlIG1haW4gbWVudSwgZXhwYW5kIHRoZSAmcXVvdDtXZWIgU2VydmljZXMmcXVvdDsgY2F0ZWdvcnkgYW5kIHNlbGVjdCAmcXVvdDtXZWIgU2VydmljZSZxdW90Oy4gQ2xpY2sgJnF1b3Q7T0smcXVvdDsgdG8gbGF1bmNoIHRoZSBXZWIgU2VydmljZXMgd2l6YXJkIG9yIHNlbGVjdCB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gdG8gZG8gdGhpcyBhdXRvbWF0aWNhbGx5LiI+Ci0gICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkKSIvPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgJnF1b3Q7VG9wIGRvd24gSmF2YSBiZWFuIFdlYiBTZXJ2aWNlJnF1b3Q7IGFzIHRoZSAmcXVvdDtXZWIgc2VydmljZSB0eXBlJnF1b3Q7LiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IkJyb3dzZSB0byBzZWxlY3QgdGhlIFNlcnZpY2UgZGVmaW5pdGlvbi4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJWZXJpZnkgdGhhdCAmcXVvdDtBcGFjaGUgQ1hGIDIueCZxdW90OyBpcyBzZWxlY3RlZCBhcyB0aGUgV2ViIHNlcnZpY2UgcnVudGltZS4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJNb3ZlIHRoZSBzZXJ2aWNlIHNsaWRlciB0byB0aGUgJnF1b3Q7RGV2ZWxvcCBzZXJ2aWNlJnF1b3Q7IHN0YWdlLiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IkFjY2VwdCBhbGwgb3RoZXIgZGVmYXVsdCB2YWx1ZXMgb24gdGhpcyBwYWdlIGFuZCBjbGljayAmcXVvdDtOZXh0ICZndDsmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iT24gdGhlIEFwYWNoZSBDWEYgV1NETCB0byBKYXZhIHBhZ2UgYWNjZXB0IHRoZSBkZWZhdWx0cyBhbmQgY2xpY2sgJnF1b3Q7TmV4dCAmZ3Q7JnF1b3Q7LiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IlNlbGVjdCAmcXVvdDtHZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbiZxdW90OyBvbiB0aGUgV1NETCB0byBKYXZhIHByZWZlcmVuY2Ugb3ZlcnJpZGUgcGFnZSBhbmQgY2xpY2sgJnF1b3Q7RmluaXNoJnF1b3Q7LiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvZ2VuZXJhdGUtY3hmLXdzZGwtY2xpZW50LWNvbXBvc2l0ZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvZ2VuZXJhdGUtY3hmLXdzZGwtY2xpZW50LWNvbXBvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YWJlYjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2dlbmVyYXRlLWN4Zi13c2RsLWNsaWVudC1jb21wb3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb3NpdGVDaGVhdHNoZWV0IG5hbWU9IkdlbmVyYXRpbmcgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiPgotICAgPHRhc2tHcm91cCBraW5kPSJzZXQiIG5hbWU9IkdlbmVyYXRpbmcgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxpbnRybz4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyB0byBnZW5lcmF0ZSBhIEpBWC1XUyBjbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRi4KLSAgICAgICAgIDxici8+Ci0gICAgICAgICA8YnIvPgotVGhlIGdlbmVyYXRlZCBjbGllbnQgd2lsbCBpbmNsdWRlIGEgbWFpbigpIHRoYXQgd2hlbiBydW4gd2lsbCBjb25uZWN0IHRvIHRoZSByZW1vdGUgc2VydmljZSBhbmQgaW52b2tlIGV2ZXJ5IG9wZXJhdGlvbiBvbiB0aGF0IHJlbW90ZSBzZXJ2aWNlLgotICAgICAgICAgPGJyLz4KLSAgICAgICAgIDxici8+Ci1UbyBhc3Npc3QgeW91IGFsb25nIHRoZSB3YXksIHdpemFyZHMgYW5kIGNvbW1hbmRzIHdpbGwgYmUgYXZhaWxhYmxlIGZvciB5b3UgdG8gbGF1bmNoIGF1dG9tYXRpY2FsbHkuCi0gICAgICA8L2ludHJvPgotICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgWW91IGp1c3QganVzdCBnZW5lcmF0ZWQgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IQotICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICA8dGFzayBraW5kPSJjaGVhdHNoZWV0IiBuYW1lPSJJbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgUnVudGltZSIgc2tpcD0idHJ1ZSI+Ci0gICAgICAgICA8aW50cm8+Ci0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBydW50aW1lIGluIHRoZSB3b3JrYmVuY2guCi08YnIvPgotPGJyLz4KLUlmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgaW4gdGhlIHdvcmtiZW5jaCB5b3UgbWF5IHNraXAgdGhpcyB0YXNrIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtTa2lwIHRoaXMgdGFzayZxdW90OyBidXR0b24uCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGluc3RhbGxlZCBhbmQgY29uZmlndXJlZCB0aGUgQXBhY2hlIENYRiBydW50aW1lIQotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNvbmZpZ3VyZS1jeGYtcnVudGltZS54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9IkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXMiIHNraXA9InRydWUiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBjcmVhdGUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGUgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BlbW50LgotPGJyLz4KLTxici8+Ci1JZiB5b3UgYWxyZWFkeSBoYXZlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBlbmFibGVkIGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB5b3UgbWF5IHNraXAgdGhpcyB0YXNrIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtTa2lwIHRoaXMgdGFzayZxdW90OyBidXR0b24uCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGNyZWF0ZWQgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGVkIGl0IGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCEKLSAgICAgICAgIDwvb25Db21wbGV0aW9uPgotICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSJjcmVhdGUtY3hmLXByb2plY3QueG1sIj4KLSAgICAgICAgIDwvcGFyYW0+Ci0gICAgICA8L3Rhc2s+Ci0gICAgICA8dGFzayBraW5kPSJjaGVhdHNoZWV0IiBuYW1lPSJHZW5lcmF0ZSBhIEpBWC1XUyBjbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRiIgc2tpcD0iZmFsc2UiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgPGI+SW50cm9kdWN0aW9uPC9iPgotICAgICAgICAgPC9pbnRybz4KLSAgICAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICAgICA8Yj5Db25jbHVzaW9uPC9iPgotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNyZWF0ZS1jbGllbnQtY3hmLnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgPC90YXNrR3JvdXA+Ci08L2NvbXBvc2l0ZUNoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvdG9wZG93bi1jeGYtY29tcG9zaXRlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy90b3Bkb3duLWN4Zi1jb21wb3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZjQ5ODhkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy90b3Bkb3duLWN4Zi1jb21wb3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb3NpdGVDaGVhdHNoZWV0IG5hbWU9IkdlbmVyYXRpbmcgYSBKQVgtV1MgU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRiI+Ci0gICA8dGFza0dyb3VwIGtpbmQ9InNldCIgbmFtZT0iR2VuZXJhdGluZyBhIEpBWC1XUyBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8aW50cm8+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZ3VpZGUgeW91IHRocm91Z2ggdGhlIGluZGl2aWR1YWwgc3RlcHMgdG8gc2V0dXAgdGhlIEFwYWNoZSBDWEYgcnVudGltZSwgY3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyLCAgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGVuYWJsZWQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50ICBhbmQgZ2VuZXJhdGUgYSBhIGZ1bGx5IGFubm90YXRlZCBKQVgtV1MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudC4gCi0gICAgICAgICA8YnIvPgotICAgICAgICAgPGJyLz4KLVRvIGFzc2lzdCB5b3UgYWxvbmcgdGhlIHdheSwgd2l6YXJkcyBhbmQgY29tbWFuZHMgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHlvdSB0byBsYXVuY2ggYXV0b21hdGljYWxseS4KLSAgICAgIDwvaW50cm8+Ci0gICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UganVzdCBjb25maWd1cmVkIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUsIGNyZWF0ZWQgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIsIGEgRHluYW1pYyBXZWIgUHJvamVjdCBlbmFibGVkIGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wZW1udCBhbmQgZ2VuZXJhdGVkIGEgSkFYLVdTIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQuCi0gICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9Ikluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBSdW50aW1lIiBza2lwPSJ0cnVlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gaW5zdGFsbCBhbmQgY29uZmlndXJlIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgaW4gdGhlIHdvcmtiZW5jaC4KLTxici8+Ci08YnIvPgotSWYgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBpbiB0aGUgd29ya2JlbmNoIHlvdSBtYXkgc2tpcCB0aGlzIHRhc2sgYnkgY2xpY2tpbmcgdGhlICZxdW90O1NraXAgdGhpcyB0YXNrJnF1b3Q7IGJ1dHRvbi4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGp1c3QgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUhCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY29uZmlndXJlLWN4Zi1ydW50aW1lLnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgICAgPHRhc2sga2luZD0iY2hlYXRzaGVldCIgbmFtZT0iSW5zdGFsbCBhbmQgY3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIiBza2lwPSJ0cnVlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gaW5zdGFsbCBhbmQgY3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyLgotPGJyLz4KLTxici8+Ci1JZiB5b3UgaGF2ZSBhbHJlYWR5IGluc3RhbGxlZCBhbmQgY3JlYXRlZCBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciB5b3UgbWF5IHNraXAgdGhpcyB0YXNrIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtTa2lwIHRoaXMgdGFzayZxdW90OyBidXR0b24uCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGluc3RhbGxlZCBhbmQgY3JlYXRlZCBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciEKLSAgICAgICAgIDwvb25Db21wbGV0aW9uPgotICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSJjcmVhdGUtdG9tY2F0LXNlcnZlci54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9IkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXMiIHNraXA9InRydWUiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBjcmVhdGUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGUgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BlbW50LgotPGJyLz4KLTxici8+Ci1JZiB5b3UgYWxyZWFkeSBoYXZlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBlbmFibGVkICBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgeW91IG1heSBza2lwIHRoaXMgdGFzayBieSBjbGlja2luZyB0aGUgJnF1b3Q7U2tpcCB0aGlzIHRhc2smcXVvdDsgYnV0dG9uLgotICAgICAgICAgPC9pbnRybz4KLSAgICAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICAgICBDb25ncmF0dWxhdGlvbnMhICBZb3UganVzdCBjcmVhdGVkIGEgRHluYW1pYyBXZWIgUHJvamVjdCBhbmQgZW5hYmxlZCBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQhCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY3JlYXRlLWN4Zi1wcm9qZWN0LnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgICAgPHRhc2sga2luZD0iY2hlYXRzaGVldCIgbmFtZT0iR2VuZXJhdGUgYSBKQVgtV1MgU0VJIGFuZCBhIHNrZWxldG9uICBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiIHNraXA9ImZhbHNlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gZ2VuZXJhdGUgIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgYW5kIGEgc2tlbGV0b24gIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQuCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgWW91IGp1c3QgZ2VuZXJhdGVkIGEgSkFYLVdTIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQuCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY3JlYXRlLXRvcERvd24tY3hmLnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgPC90YXNrR3JvdXA+Ci08L2NvbXBvc2l0ZUNoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3F1aWNrc3RhcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjM2MzU0ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlF1aWNrIFN0YXJ0PC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkFwYWNoZSBDWEYgUXVpY2sgU3RhcnQ8L2gyPgotPHA+VHJ5IG91dCB0aGUgZm9sbG93aW5nIGNoZWF0IHNoZWV0cyB0byBoZWxwIHlvdSBxdWlja2x5IHN0YXJ0IHVzaW5nIEpBWC1XUyBUb29scyBhbmQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSB0byBjcmVhdGUgV2ViIHNlcnZpY2UgYXBwbGljYXRpb25zLjwvcD4KLTxicj4KLTxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLm9wZW5DaGVhdFNoZWV0KGNoZWF0U2hlZXRJZD1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY3hmLmJvdHRvbXVwKSIpJz4KLSAgICAJCTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gYm90dG9tdXAgY2hlYXQgc2hlZXQiPjxzdHJvbmc+Q3JlYXRpbmcgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEY8L3N0cm9uZz48L2E+Ci08YnI+Ci08YnI+Ci08YSBjbGFzcz0iY29tbWFuZC1saW5rIiBocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5vcGVuQ2hlYXRTaGVldChjaGVhdFNoZWV0SWQ9b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmN4Zi50b3Bkb3duKSIpJz4KLSAgICAJCTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gdG9wZG93biBjaGVhdCBzaGVldCI+PHN0cm9uZz5HZW5lcmF0aW5nIGEgSkFYLVdTIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L3N0cm9uZz48L2E+Ci08YnI+Ci08YnI+Ci08YSBjbGFzcz0iY29tbWFuZC1saW5rIiBocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5vcGVuQ2hlYXRTaGVldChjaGVhdFNoZWV0SWQ9b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmN4Zi50b3Bkb3duLmNsaWVudCkiKSc+Ci0gICAgCQk8aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIGNsaWVudCBjaGVhdCBzaGVldCI+PHN0cm9uZz5HZW5lcmF0aW5nIGEgSkFYLVdTIGNsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9zdHJvbmc+PC9hPgotPGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9pbWFnZXMvbmdyZWxjLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9pbWFnZXMvbmdyZWxjLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTYxZTNhYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvaW1hZ2VzL25ncmVsYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvaW1hZ2VzL25ncmVsci5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvaW1hZ2VzL25ncmVsci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3MjZmOGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHQucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NGJlZTJiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9pbWFnZXMvbmdyZWx0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9sZWdhbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2xlZ2FsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxMmZjZmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2xlZ2FsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5MZWdhbDwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkxlZ2FsPC9oMj4KLTxwPkNvcHlyaWdodCAmY29weTsgMjAwOSwgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvcD4KLTxwPlRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+PC9wPgotPHA+PGEgaHJlZj0iYWJvdXQuaHRtbCI+VGVybXMgYW5kIGNvbmRpdGlvbnMgcmVnYXJkaW5nIHRoZSB1c2Ugb2YgdGhpcyBndWlkZS48L2E+PC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjUwNTgxMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUNYRiBXZWIgc2VydmljZXMgVXNlciBHdWlkZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLWNoZWF0c2hlZXQuY3hmLmJvdHRvbXVwLmNvbXBvc2l0ZT1DcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgQXBhY2hlIENYRgotY2hlYXRzaGVldC5jeGYudG9wZG93bi5jb21wb3NpdGU9R2VuZXJhdGluZyBhbiBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGCi1jaGVhdHNoZWV0LmN4Zi50b3Bkb3duLmNsaWVudC5jb21wb3NpdGU9R2VuZXJhdGluZyBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGY0OTVmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy40Ij8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICA8dG9jIGZpbGU9InRvY2dldHRpbmdzdGFydGVkLnhtbCIvPgotICAgICAgPHRvYyBmaWxlPSJ0b2N0YXNrcy54bWwiLz4KLSAgICAgIDx0b2MgZmlsZT0idG9jcmVmZXJlbmNlLnhtbCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmNoZWF0U2hlZXRDb250ZW50Ij4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzIgotICAgICAgICAgICAgY29tcG9zaXRlPSJ0cnVlIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvYm90dG9tVXAtY3hmLWNvbXBvc2l0ZS54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmN4Zi5ib3R0b211cCIKLSAgICAgICAgICAgIG5hbWU9IiVjaGVhdHNoZWV0LmN4Zi5ib3R0b211cC5jb21wb3NpdGUiPgotICAgICAgPC9jaGVhdHNoZWV0PgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MiCi0gICAgICAgICAgICBjb21wb3NpdGU9InRydWUiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy90b3Bkb3duLWN4Zi1jb21wb3NpdGUueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jeGYudG9wZG93biIKLSAgICAgICAgICAgIG5hbWU9IiVjaGVhdHNoZWV0LmN4Zi50b3Bkb3duLmNvbXBvc2l0ZSI+Ci0gICAgICA8L2NoZWF0c2hlZXQ+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cyIKLSAgICAgICAgICAgIGNvbXBvc2l0ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2dlbmVyYXRlLWN4Zi13c2RsLWNsaWVudC1jb21wb3NpdGUueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jeGYudG9wZG93bi5jbGllbnQiCi0gICAgICAgICAgICBuYW1lPSIlY2hlYXRzaGVldC5jeGYudG9wZG93bi5jbGllbnQuY29tcG9zaXRlIj4KLSAgICAgIDwvY2hlYXRzaGVldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDRkZTYyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+Q1hGIFByb2plY3QgRmFjZXQ8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+Q1hGIFByb2plY3QgRmFjZXQ8L2gyPgotPHA+RmFjZXRzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHVuaXRzIG9mIGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSBmYWNldCBiYXNlZCBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLjwvcD4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGZhY2V0cyBzZWUgdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2ZhY2V0cy5odG1sIj5XVFAgUHJvamVjdCBGYWNldHMgZG9jdW1lbnRhdGlvbjwvYT4uPC9wPgotPHA+SkFYLVdTIFRvb2xzIHByb3ZpZGVzIHRoZSBDWEYgRmFjZXQgdGhhdCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHdoZW4gaW5zdGFsbGVkIG9uIGEgRHluYW1pYyBXZWIgUHJvamVjdDo8L3A+Ci08dWw+Ci0gIDxsaT5Db25maWd1cmVzIHRoZSBwcm9qZWN0IHdpdGggdGhlIENYRiBDbGFzc3BhdGggQ29udGFpbmVyLjwvbGk+Ci0gIDxsaT5Db25maWd1cmVzIHRoZSBwcm9qZWN0IHdpdGggdGhlIENYRiBKQVgtV1MgZW5kcG9pbnQgY29uZmlndXJhdGlvbiBvcHRpb24gdGhhdCBpcyBzZWxlY3RlZCBpbiB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2VuZHBvaW50X2NvbmZpZ190YWIuaHRtbCI+RW5kcG9pbnQgQ29uZmlnPC9hPiBwcmVmZXJlbmNlcy48L2xpPgotICA8bGk+RW5hYmxlcyBKQVgtV1MgQW5ub3RhdGlvbiBwcm9jZXNzaW5nIGlmIHRoZSBvcHRpb24gaXMgc2VsZWN0ZWQgaW4gdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9qYXh3c190YWIuaHRtbCI+SkFYLVdTPC9hPiBwcmVmZXJlbmNlcy48L2xpPgotPC91bD4KLTxwPlRoZSBDWEYgRmFjZXQgaGFzIHRoZSBmb2xsb3dpbmcgZmFjZXQgcHJlcmVxdWlzaXRlczo8L3A+Ci08dWw+Ci0gIDxsaT5EeW5hbWljIFdlYiBNb2R1bGUgdmVyc2lvbiAyLjQgb3IgZ3JlYXRlcjwvbGk+Ci0gIDxsaT5KYXZhIHZlcnNpb24gNS4wIG9yIGdyZWF0ZXI8L2xpPgotPC91bD4KLTxwPlRoZSBDWEYgRmFjZXQgYW5kIGl0J3MgcHJlcmVxdWlzaXRlcyBhcmUgZ3JvdXBlZCBpbnRvIGEgcHJvamVjdCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIHNlbGVjdGVkIHdoZW4gY3JlYXRpbmcgYSBEeW5hbWljIFdlYiBQcm9qZWN0LjwvcD4KLQotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGluZyBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXM8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvaW5zdGFsbF9jeGZfZmFjZXQuaHRtbCI+SW5zdGFsbCB0aGUgQ1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvZW5kcG9pbnRfY29uZmlnX3RhYi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9lbmRwb2ludF9jb25maWdfdGFiLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0YjkzYWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9lbmRwb2ludF9jb25maWdfdGFiLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SkFYLVdTIEVuZHBvaW50IENvbmZpZ3VyYXRpb24gUHJlZmVyZW5jZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+RW5kcG9pbnQgQ29uZmlnIFByZWZlcmVuY2VzPC9oMj4KLTxwPlRoZSA8c3Ryb25nPkVuZHBvaW50IENvbmZpZzwvc3Ryb25nPiB0YWIgcHJvdmlkZXMgc2V0dGluZyB0aGF0IGNvbnRyb2wgdGhlIHR5cGUgb2YgZW5kcG9pbnQgY29uZmlndXJhdGlvbiB0aGF0IHdlYiBwcm9qZWN0cyBhcmUgY29uZmlndXJlZCB3aXRoIHdoZW4gdGhlIENYRiBGYWNldCBpcyBpbnN0YWxsZWQuPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3NwcmluZ19jb25maWcucG5nIiBhbHQ9IlNwcmluZyBDb25maWcgdGFiIiA+IDwvcD4KLTxwPjwvcD4KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIHN1bW1hcnk9IkphdmEgc2VhcmNoIGFjdGlvbnMiPgotICAgICAgPHRoZWFkPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPk9wdGlvbjwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+RGVmYXVsdDwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGhlYWQ+Ci0KLSAgICAgIDx0Ym9keT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5Vc2UgQ1hGIFNlcnZsZXQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5DcmVhdGVzIGEgY3hmLXNlcnZsZXQueG1sIGZpbGUgaW4gdGhlIFdlYiBQcm9qZWN0cyBXRUItSU5GIGRpcmVjdG9yeS4gVGhpcyBpcyB0aGUgc2xvd2VyIG9wdGlvbiBvZiB0aGUgdHdvIGFzIGl0IGxvYWRzIGFsbCBwb3NzaWJsZSBDWEYgbW9kdWxlcyBmb3IgYW4gZW5kcG9pbnQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkNyZWF0ZXMgYSBiZWFucy54bWwgZmlsZSBpbiB0aGUgV2ViIFByb2plY3RzIFdFQi1JTkYgZGlyZWN0b3J5LiBUaGlzIGlzIHRoZSBmYXN0ZXN0IG9wdGlvbiBhcyBpdCBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2Ygd2hpY2ggQ1hGIG1vZHVsZXMgdG8gbG9hZCBmb3IgYW4gZW5kcG9pbnQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci0gICAgCi08cD5EdXJpbmcgYm90dG9tLXVwIGFuZCB0b3AtZG93biB3ZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgdGhlIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgd2ViIHByb2plY3QgaXMgdXBkYXRlZCB3aXRoIGEgamF4d3M6ZW5kcG9pbnQgZWxlbWVudCBmb3IgdGhlIGdlbmVyYXRlZCB3ZWIgc2VydmljZS48L3A+Ci0KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vcmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sIj5DWEYgUHJvamVjdCBGYWNldDwvYT48YnI+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwiPkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXM8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwiPkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfdG9wZG93bi5odG1sIj5HZW5lcmF0ZSBhbiBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hcHRfcHJvY2Vzc2luZy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hcHRfcHJvY2Vzc2luZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxMmJlYzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYXB0X3Byb2Nlc3NpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvY3hmMnhfcHJlZmVyZW5jZXMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvY3hmMnhfcHJlZmVyZW5jZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZmYzN2I4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2N4ZjJ4X3ByZWZlcmVuY2VzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2N4Zl9ydW50aW1lX3RhYi5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9jeGZfcnVudGltZV90YWIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGI2ZTcyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2N4Zl9ydW50aW1lX3RhYi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9qYXZhMndzX3RhYi5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9qYXZhMndzX3RhYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4OTA2OGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvamF2YTJ3c190YWIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvamF4d3NfYW5ub3RhdGlvbnMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvamF4d3NfYW5ub3RhdGlvbnMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MjE2OTBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2pheHdzX2Fubm90YXRpb25zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3NlcnZlcl9ydW50aW1lLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3NlcnZlcl9ydW50aW1lLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGYwMzBmMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9zZXJ2ZXJfcnVudGltZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9zcHJpbmdfY29uZmlnLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3NwcmluZ19jb25maWcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTY2NDE3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3NwcmluZ19jb25maWcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvd3NkbDJqYXZhLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3dzZGwyamF2YS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwMmQ2NGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvd3NkbDJqYXZhLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3hqYy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy94amMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYTc3MDIxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3hqYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2phdmEyd3NfdGFiLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2phdmEyd3NfdGFiLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5ZjMyZmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9qYXZhMndzX3RhYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5KYXZhMldTIFByZWZlcmVuY2VzPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkphdmEyV1MgUHJlZmVyZW5jZXM8L2gyPgotPHA+VGhlIDxzdHJvbmc+SmF2YTJXUzwvc3Ryb25nPiB0YWIgcHJvdmlkZXMgc2V0dGluZ3MgdGhhdCBjb250cm9sIHRoZSBDWEYgamF2YTJ3cyB0b29sIChmb3IgQ1hGIDIuMS54IHJ1bnRpbWVzIGFuZCBhYm92ZSkuIFdoZW4gYSBDWEYgMi4wLnggcnVudGltZSBpcyBzZWxlY3RlZCB0aGlzIHBhZ2UgZGlzcGxheXMgYSBzdWJzZXQgb2YgdGhlIGF2YWlsYWJsZSBzZXR0aW5nIHRoYXQgcHJvdmlkZXMgY29udHJvbCBvZiB0aGUgQ1hGIGphdmEyd3NkbCB0b29sLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9qYXZhMndzX3RhYi5wbmciIGFsdD0iSmF2YTJXUyB0YWIiID4gPC9wPgotPHA+PC9wPgotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgc3VtbWFyeT0iSmF2YSBzZWFyY2ggYWN0aW9ucyI+Ci0gICAgICA8dGhlYWQ+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+T3B0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIAotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZWZhdWx0PC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90aGVhZD4KLQotICAgICAgPHRib2R5PgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkRlZmF1bHQgRnJvbnRlbmQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TcGVjaWZpZXMgdGhlIGZyb250IGVuZCB0byB1c2UuIEN1cnJlbnRseSBvbmx5IHRoZSBqYXh3cyBmcm9udCBlbmQgaXMgc3VwcG9ydGVkPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmpheHdzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5EZWZhdWx0IERhdGFiaW5kaW5nPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U3BlY2lmaWVzIHRoZSBkYXRhIGJpbmRpbmcgdG8gdXNlLiBDdXJyZW50bHkgb25seSB0aGUgamF4YiBkYXRhIGJpbmRpbmcgaXMgc3VwcG9ydGVkPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+amF4YjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+R2VuZXJhdGUgQ2xpZW50PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIGEgY2xpZW50IG1haW5saW5lIHVzaW5nIEpBWC1XUyBBUElzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBTZXJ2ZXI8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgbWFpbmxpbmUgdXNpbmcgSkFYLVdTIEFQSXM8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+R2VuZXJhdGUgV3JhcHBlciBhbmQgRmF1bHQgQmVhbnM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbnM8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+dHJ1ZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPiAgICAgICAgCi0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBXU0RMPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIGEgV1NETCBkb2N1bWVudDwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIAotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5EZWZhdWx0IFNPQVAgQmluZGluZzwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNwZWNpZnkgdGhlIFNPQVAgYmluZGluZyB0byBpbmNsdWRlIGluIHRoZSBnZW5lcmF0ZWQgV1NETCBkb2N1bWVudC4gU09BUCAxLjEgYW5kIFNPQVAgMS4yIHN1cHBvcnRlZDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNPQVAgMS4xPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBzZXBhcmF0ZSBYU0QgZm9yIHRoZSB0eXBlczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBvdXRwdXQgc2NoZW1hcyB0byBzZXBhcmF0ZSBmaWxlcyB3aGVuIGdlbmVyYXRpbmcgYSBXU0RMIGRvY3VtZW50PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+dHJ1ZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci08cD5UaGUgb3B0aW9ucyBvbiB0aGlzIHRhYiBhcmUgcHJlc2VudGVkIGluIHRoZSB3ZWIgc2VydmljZXMgd2l6YXJkIHdoZW4gY3JlYXRpbmcgYSBib3R0b20tdXAgd2ViIHNlcnZpY2Ugd2l0aCB0aGUgQXBhY2hlIENYRiBydW50aW1lLjwvcD4KLTxwPlRoZSBvcHRpb25zIHRoZXJlIGNhbiBiZSBjaGFuZ2VkIGZyb20gdGhlaXIgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB3ZWIgc2VydmljZSBiZWluZyBjcmVhdGVkLjwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCI+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2pheHdzX3RhYi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9qYXh3c190YWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNmNzQ3YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2pheHdzX3RhYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkpBWC1XUyBQcmVmZXJlbmNlczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5KQVgtV1MgUHJlZmVyZW5jZXM8L2gyPgotPHA+VGhlIDxzdHJvbmc+SkFYLVdTPC9zdHJvbmc+IHRhYiBwcm92aWRlcyBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIEpBWC1XUyBhbm5vdGF0aW9ucyBhbmQgdGhlIGVuYWJsZW1lbnQgb2YgSkFYLVdTIGFubm90YXRpb24gdmFsaWRhdGlvbiBwcm9jZXNzaW5nLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9qYXh3c19hbm5vdGF0aW9ucy5wbmciIGFsdD0iSkFYV1MgQW5ub3RhdGlvbnMiID4gPC9wPgotPHA+U2VsZWN0IHRoZSBKQVgtV1MgYW5ub3RhdGlvbnMgdGhhdCBhcmUgYWRkZWQgYnkgZGVmYXVsdCB0byB0aGUgaW1wbGVtZW50YXRpb24gYmVhbiBvciBTRUkgYmVmb3JlIGlucHV0IHRvIHRoZSBDWEYgamF2YTJ3cyB0b29sLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9hcHRfcHJvY2Vzc2luZy5wbmciIGFsdD0iQVBUIFByb2Nlc3NpbmciPiA8L3A+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGFubm90YXRpb24gdmFsaWRhdGlvbiBwcm9jZXNzaW5nIGluIHdlYiBwcm9qZWN0cyB3aGVuIGNvbmZpZ3VyZWQgd2l0aCB0aGUgQ1hGIEZhY2V0LjwvcD4KLTxwPlRoZSBKRFQgQVBUIHByb2Nlc3NvcnMgcmVwb3J0IGVycm9ycywgd2FybmluZ3MgYW5kIGluZm9ybWF0aW9uIG1lc3NhZ2VzIGluIHRoZSBKYXZhIEVkaXRvciBhbmQgUHJvYmxlbXMgVmlldyB3aGVuIEpBWC1XUyBydWxlcyBhcmUgYnJva2VuLjwvcD4KLTxwPkFubm90YXRpb24gcHJvY2Vzc2luZyBjYW4gYmUgZW5hYmxlZCBhbmQgZGlzYWJsZWQgb24gYW55IEphdmEgYmFzZWQgcHJvamVjdCB1c2luZyB0aGUgQW5ub3RhdGlvbiBQcm9jZXNzaW5nIHByb3BlcnRpZXMgcGFnZSBvbiB0aGUgcHJvamVjdHMgY29udGV4dCBtZW51LjwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jb25maWd1cmluZ19qYXh3c19hbm5vdGF0aW9uX3Byb2Nlc3NpbmcuaHRtbCI+RW5hYmxlIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NlZDI4NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3ByZWZlcmVuY2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+QXBhY2hlIENYRiAyLnggUHJlZmVyZW5jZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5BcGFjaGUgQ1hGIDIueCBQcmVmZXJlbmNlczwvaDI+Ci08cD5KQVgtV1MgVG9vbHMgcHJvdmlkZXMgYSBwcmVmZXJlbmNlIHBhZ2UgZm9yIHNldHRpbmcgdXAgYW5kIGNvbmZpZ3VyaW5nIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUuPC9wPgotPHA+VGhlIENYRiAyLnggcHJlZmVyZW5jZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSAKLTxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLndpbmRvdy5wcmVmZXJlbmNlcyhwcmVmZXJlbmNlUGFnZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSkiKSc+Ci08aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBDWEYgMi54IHByZWZlcmVuY2UgcGFnZSI+Ci08c3Ryb25nPldpbmRvdyAmZ3Q7IFByZWZlcmVuY2VzLi4uICZndDsgV2ViIFNlcnZpY2VzICZndDsgQ1hGIDIueCBQcmVmZXJlbmNlczwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUuIDwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9jeGYyeF9wcmVmZXJlbmNlcy5wbmciIGFsdD0iQ1hGIDIueCBQcmVmZXJlbmNlcyIgPiA8L3A+Ci08cD5UaGUgQ1hGIFJ1bnRpbWUgdGFiIGlzIHVzZWQgdG8gcG9pbnQgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24gb2YgYSBDWEYgMi54IHJ1bnRpbWUuPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2N4Zl9ydW50aW1lX3RhYi5wbmciIGFsdD0iQ1hGIDIueCBQcmVmZXJlbmNlcyIgPiA8L3A+Ci08cD5UaGUgPHN0cm9uZz5FeHBvcnQgcnVudGltZSBsaWJyYXJpZXMuLi48L3N0cm9uZz4gb3B0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgY29udHJvbHMgd2hldGhlciB0aGUgQ1hGIGxpYnJhcnkgamFyIGZpbGVzIGFyZSByZXNvbHZlZCBpbnRvIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIgb2YgdGhlIHdlYiBtb2R1bGUgYXQgZGVwbG95bWVudCB0aW1lLjwvcD4KLTxwPlRoaXMgb3B0aW9uIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIG9uIGV4aXN0aW5nIHByb2plY3RzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgQ1hGIEZhY2V0IHVzaW5nIHRoZSBKYXZhIEVFIE1vZHVsZSBEZXBlbmRlbmNpZXMgcHJvcGVydGllcyBwYWdlLjwvcD4KLTxwPkZvciBkZXRhaWxzIG9uIHRoZSBvdGhlciBDWEYgMi54IHByZWZlcmVuY2VzIHRhYnMsIHJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzOjwvcD4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9ImphdmEyd3NfdGFiLmh0bWwiPkphdmEyV1M8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IndzZGwyamF2YV90YWIuaHRtbCI+V1NETDJKYXZhPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJqYXh3c190YWIuaHRtbCI+SkFYLVdTPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJlbmRwb2ludF9jb25maWdfdGFiLmh0bWwiPkVuZHBvaW50IENvbmZpZzwvYT48L2xpPgotPC91bD4KLUZvciBpbmZvcm1hdGlvbiBvbiBzZXR0aW5nIEFwYWNoZSBDWEYgYXMgdGhlIGRlZmF1bHQgV2ViIHNlcnZpY2VzIHJ1bnRpbWUsIHJlZmVyIHRvIHRoaXMgZG9jdW1lbnQuCi08dWw+Ci0gIDxsaT48YSBocmVmPSJzZXJ2ZXJfcnVudGltZS5odG1sIj5TZXJ2ZXIgYW5kIFJ1bnRpbWU8L2E+PC9saT4KLTwvdWw+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbCI+Q1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL21hbmFnZV9jeGZfbGliX2V4cG9ydC5odG1sIj5NYW5hZ2UgdGhlIGV4cG9ydGluZyBvZiBDWEYgbGlicmFyaWVzIGF0IGRlcGxveW1lbnQgdGltZTwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9zZXJ2ZXJfcnVudGltZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9zZXJ2ZXJfcnVudGltZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjJjNzAxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2Uvc2VydmVyX3J1bnRpbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5TZXJ2ZXIgYW5kIFJ1bnRpbWU8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+U2VydmVyIGFuZCBSdW50aW1lPC9oMj4KLUFwYWNoZSBDWEYgY2FuIGJlIHNldCBhcyB0aGUgZGVmYXVsdCBXZWIgc2VydmljZXMgcnVudGltZSBzZWxlY3Rpb24gaW4gdGhlIFdlYiBzZXJ2aWNlcyB3aXphcmRzIHVzaW5nIHRoZSBTZXJ2ZXIgYW5kIFJ1bnRpbWUgcHJlZmVyZW5jZSBwYWdlLgotPHA+VGhlIFNlcnZlciBhbmQgUnVudGltZSBwcmVmZXJlbmNlIHBhZ2UgY2FuIGJlIGFjY2Vzc2VkIHZpYSAKLTxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLndpbmRvdy5wcmVmZXJlbmNlcyhwcmVmZXJlbmNlUGFnZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UpIiknPgotPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgQ1hGIDIueCBwcmVmZXJlbmNlIHBhZ2UiPgotPHN0cm9uZz5XaW5kb3cgJmd0OyBQcmVmZXJlbmNlcy4uLiAmZ3Q7IFdlYiBTZXJ2aWNlcyAmZ3Q7IFNlcnZlciBhbmQgUnVudGltZTwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUuIDwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9zZXJ2ZXJfcnVudGltZS5wbmciIGFsdD0iU2VydmVyIGFuZCBSdW50aW1lIiA+IDwvcD4KLTxwPlNlbGVjdCA8Yj5BcGFjaGUgQ1hGIDIueDwvYj4gaW4gdGhlIDxiPldlYiBzZXJ2aWNlIHJ1bnRpbWU8L2I+IGRyb3AgZG93biBsaXN0IGFuZCBjbGljayA8Yj5PSzwvYj4uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS93c2RsMmphdmFfdGFiLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2UyYjcwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+V1NETDJKYXZhIFByZWZlcmVuY2VzPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPldTREwySmF2YSBQcmVmZXJlbmNlczwvaDI+Ci08cD5UaGUgPHN0cm9uZz5XU0RMMkphdmE8L3N0cm9uZz4gdGFiIHByb3ZpZGVzIHNldHRpbmdzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgQ1hGIHdzZGwyamF2YSB0b29sLgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3dzZGwyamF2YS5wbmciIGFsdD0iSmF2YTJXUyB0YWIiID4gPC9wPgotPHA+PC9wPgotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgc3VtbWFyeT0iSmF2YSBzZWFyY2ggYWN0aW9ucyI+Ci0gICAgICA8dGhlYWQ+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+T3B0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RoZWFkPgotCi0gICAgICA8dGJvZHk+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+R2VuZXJhdGUgU2VydmVyPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGEgc2VydmVyIG1haW5saW5lPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIGJlYW48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdHM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGEgZ2VuZXJhdGVkIGNsaWVudCBhbmQgaW1wbGVtZW50YXRpb248L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5FbmFibGUgcHJvY2Vzc2luZyBvZiBpbXBsaWNpdCBTT0FQIGhlYWRlcnM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZW5hYmxlIHRoZSBwcm9jZXNzaW5nIG9mIG9mIFNPQVAgaGVhZGVycyBkZWZpbmVkIGluIHRoZSB3c2RsOmJpbmRpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5FbmFibGUgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZW5hYmxlIHRoZSBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IG5hbWVwc2FjZSBwYWNrYWdlIG5hbWUgbWFwcGluZzwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPnRydWU8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4gICAgICAgIAotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+RW5hYmxlIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZW5hYmxlIHRoZSBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+dHJ1ZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+RW5hYmxlIEF1dG8gTmFtZSBSZXNvbHV0aW9uPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSBuYW1pbmcgY29uZmxpY3RzIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2Ugb2YgYmluZGluZyBjdXN0b21pemF0aW9uczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5Vc2UgdGhlIEFwYWNoZSBDWEYgcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyB0eXBlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIHRoZSBvbGRlciBDWEYgcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyB0eXBlcyBpbnN0ZWFkIG9mIHRoZSBKQVgtV1MgMi4xIGNvbXBsaWFudCBXUy1BZGRyZXNzaW5nIHR5cGVzLiBVc2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggQ1hGIDIuMDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSBYSkMgcHJvY2Vzc29yLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy94amMucG5nIiBhbHQ9IkphdmEyV1MgdGFiIiA+IDwvcD4KLTxwPjwvcD4KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIHN1bW1hcnk9IkphdmEgc2VhcmNoIGFjdGlvbnMiPgotICAgICAgPHRoZWFkPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPk9wdGlvbjwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZWZhdWx0PC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90aGVhZD4KLQotICAgICAgPHRib2R5PgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1YZHY8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gaW5pdGlhbGl6ZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD4tWHRzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGFjdGl2YXRlIHBsdWdpbiB0byBhZGQgYSB0b1N0cmluZygpIG1ldGhvZCB0byBnZW5lcmF0ZWQgY2xhc3NlczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+ICAgICAgICAgCi0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD4tWHRzOnN0eWxlOm11bHRpbGluZTwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBoYXZlIHRvU3RyaW5nIHByb2R1Y2UgbXVsdGkgbGluZSBvdXRwdXQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+LVh0czpzdHlsZTpzaW1wbGU8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gaGF2ZSB0b1N0cmluZyBwcm9kdWNlIHNpbmdsZSBsaW5lIHRlcnNlIG91dHB1dDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1YbG9jYXRvcjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBlbmFibGUgc291cmNlIGxvY2F0aW9uIHN1cHBvcnQgZm9yIGdlbmVyYXRlZCBjb2RlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4gICAgICAgIAotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+LVhzeW5jLW1ldGhvZHM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgYWNjZXNzb3IgbWV0aG9kcyB3aXRoIHRoZSAnc3luY2hyb25pemVkJyBrZXl3b3JkPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1tYXJrLWdlbmVyYXRlZDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBhZGQgQEdlbmVyYXRlZCBhbm5vdGF0aW9ucyB0byB0aGUgZ2VuZXJhdGVkIGNvZGU8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci0KLTxwPlRoZSBvcHRpb25zIG9uIHRoaXMgdGFiIGFyZSBwcmVzZW50ZWQgaW4gdGhlIHdlYiBzZXJ2aWNlcyB3aXphcmQgd2hlbiBjcmVhdGluZyBhIHRvcC1kb3duIHdlYiBzZXJ2aWNlIHdpdGggdGhlIEFwYWNoZSBDWEYgcnVudGltZS48L3A+Ci08cD5UaGUgb3B0aW9ucyB0aGVyZSBjYW4gYmUgY2hhbmdlZCBmcm9tIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgd2ViIHNlcnZpY2UgYmVpbmcgY3JlYXRlZC48L3A+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX3RvcGRvd24uaHRtbCI+R2VuZXJhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGU4OWYyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jb25maWd1cmluZ19qYXh3c19hbm5vdGF0aW9uX3Byb2Nlc3NpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkNvbmZpZ3VyaW5nIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+RW5hYmxlIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L2gyPgotPHA+SWYgdGhlIDxzdHJvbmc+RW5hYmxlIGFubm90YXRpb24gdmFsaWRhdGlvbiBwcm9jZXNzaW5nPC9zdHJvbmc+IHNldHRpbmcgb24gdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9qYXh3c190YWIuaHRtbCI+SkFYLVdTPC9hPiB0YWIgaW4KLXRoZSBBcGFjaGUgQ1hGIDIueCBwcmVmZXJlbmNlcyBpcyBzZWxlY3RlZCwgYW5ub3RhdGlvbiBwcm9jZXNzaW5nIHdpbGwgYmUgZW5hYmxlZCBvbiBwcm9qZWN0cyBvbiBhcyBwYXJ0IG9mIHRoZSBDWEYgRmFjZXQgaW5zdGFsbC48L3A+Ci0KLTxoMz5FbmFibGluZyBFeGlzdGluZyBQcm9qZWN0czwvaDM+Ci1UbyB0dXJuIGFubm90YXRpb24gcHJvY2Vzc2luZyBvbiBvciBvZmYgb24gYW4gZXhpc3RpbmcgcHJvamVjdCByaWdodC1jbGljayBvbiB0aGUgcHJvamVjdCBhbmQgY2hvb3NlIDxiPlByb3BlcnRpZXM8L2I+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gCi0gT24gdGhlIDxzdHJvbmc+SmF2YSBDb21waWxlciA+IEFubm90YXRpb24gUHJvY2Vzc2luZzwvc3Ryb25nPiBwcm9wZXJ0aWVzIHBhZ2Ugc2VsZWN0IG9yIGRlc2VsZWN0IHRoZSA8c3Ryb25nPkVuYWJsZSBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L3N0cm9uZz4gY2hlY2sgYm94IGFuZCB0aGVuIGNsaWNrIDxiPk9LPC9iPi4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9hbm5vdGF0aW9uX3Byb2Nlc3NpbmcucG5nIiBhbHQ9IkFubm90YXRpb24gUHJvY2Vzc2luZyIgPiA8L3A+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbCI+Q1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZiM2UxNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRjwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRjwvaDI+Ci08aDM+UHJlcmVxdWlzaXRlczo8L2gzPgotPG9sPgotPGxpPkluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBydW50aW1lIGVudmlyb25tZW50LiBTZWUgdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcmVxdWlyZW1lbnRzLmh0bWwiPlJlcXVpcmVtZW50cyBhbmQgSW5zdGFsbGF0aW9uPC9hPiBwYWdlIGZvciBtb3JlIGRldGFpbHMuPC9saT4KLTxsaT5DcmVhdGUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGUgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IGFzIGRlc2NyaWJlZCBoZXJlOiA8YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbCI+Q3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlczwvYT4uPC9saT4KLTxsaT5DcmVhdGUgb3IgaW1wb3J0IGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIGludG8gdGhlIHNvdXJjZSBmb2xkZXIgb2YgdGhlIER5bmFtaWMgV2ViIFByb2plY3QuPC9saT4KLTwvb2w+Ci1UbyBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBiZWFuIHVzaW5nIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgZW52aXJvbm1lbnQ6Ci08b2w+Ci08bGk+U2VsZWN0IDxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUob3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZS5wZXJzcGVjdGl2ZUlkPW9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSkiKSc+Ci0JPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSI+PHN0cm9uZz5XaW5kb3cgJmd0OyBPcGVuIFBlcnNwZWN0aXZlICZndDsgSmF2YSBFRTwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUgdG8gc3dpdGNoIHRvIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLjwvbGk+Ci08bGk+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBzZWxlY3QgdGhlIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB0aGF0IHlvdSBjcmVhdGVkIG9yIGltcG9ydGVkIGludG8gdGhlIER5bmFtaWMgV2ViIFByb2plY3RzIHNvdXJjZSBmb2xkZXIuPC9saT4KLTxsaT5PcGVuIHRoZSBXZWIgU2VydmljZSB3aXphcmQgYnkgc2VsZWN0aW5nIDxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZChuZXdXaXphcmRJZD1vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCkiKSc+Ci08aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBuZXcgd2ViIHNlcnZpY2Ugd2l6YXJkIj48c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlci4uLiAmZ3Q7IFdlYiBTZXJ2aWNlcyAmZ3Q7IFdlYiBTZXJ2aWNlPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudS48L2xpPgotPGxpPldlYiBTZXJ2aWNlcyBwYWdlOiBzZWxlY3QgPGI+Qm90dG9tIHVwIEphdmEgYmVhbiBXZWIgU2VydmljZTwvYj4gYXMgdGhlIFdlYiBzZXJ2aWNlIHR5cGUgYW5kIGJyb3dzZSB0byBzZWxlY3QgdGhlIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgV2ViIHNlcnZpY2U6PHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2JvdHRvbV91cF93aXphcmQucG5nIiBhbHQ9IkJvdHRvbSBVcCBXZWIgU2VydmljZXMgV2l6YXJkIiA+PC9wPgotPG9sIHR5cGU9ImEiPgotPGxpPk1vdmUgdGhlIHNlcnZpY2Ugc2xpZGVyIHRvIHRoZSBzdGFnZSBvZiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgdGhhdCB5b3Ugd2lzaCB0byBjb21wbGV0ZS48L2xpPgotPHVsPgotPGxpPkRldmVsb3A6IEludm9rZXMgdGhlIEFwYWNoZSBDWEYgamF2YTJ3cyB0b29sIHVzaW5nIHRoZSBwcmVmZXJlbmNlIGRlZmF1bHRzIGFuZCB0aGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgaW4gdGhlIHdpemFyZCB0byBjcmVhdGUgYSBzZXJ2aWNlLiBUaGUgd2l6YXJkIGFsc28gZ2VuZXJhdGVzIGEgSkFYLVdTIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gZmlsZS48L2xpPgotPGxpPkFzc2VtYmxlOiBJZiByZXF1aXJlZCBieSB0aGUgdGFyZ2V0IHNlcnZlciB0aGlzIHBoYXNlIGFzc2VtYmxlcyBhbmQgY29uZmlndXJlcyB0aGUgcHJvamVjdCB0aGF0IGhvc3RzIHRoZSBXZWIgc2VydmljZSBpbnRvIGFuIEVBUi48L2xpPgotPGxpPkRlcGxveTogR2VuZXJhdGVzIHRoZSBkZXBsb3ltZW50IGFydGlmYWN0cyBmb3IgdGhlIFdlYiBzZXJ2aWNlLjwvbGk+Ci08bGk+SW5zdGFsbDogSW5zdGFsbHMgYW5kIGNvbmZpZ3VyZXMgdGhlIFdlYiBNb2R1bGUgYW5kIEVBUnMgb24gdGhlIHRhcmdldCBzZXJ2ZXIuPC9saT4KLTxsaT5TdGFydDogU3RhcnRzIHRoZSB0YXJnZXQgc2VydmVyIG9uY2UgdGhlIFdlYiBzZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZCBvbiBpdC48L2xpPgotPGxpPlRlc3Q6IFVzZSB0aGUgV2ViIFNlcnZpY2UgRXhwbG9yZXIgdG8gdGVzdCB0aGUgZ2VuZXJhdGVkIFdlYiBzZXJ2aWNlLjwvbGk+Ci08L3VsPgotPGxpPlNlcnZlcjogU2VsZWN0IGEgc2VydmVyIHRvIGRlcGxveSB5b3VyIFdlYiBzZXJ2aWNlIHRvLjwvbGk+Ci08bGk+V2ViIHNlcnZpY2UgcnVudGltZTogU2VsZWN0IEFwYWNoZSBDWEYgMi54PC9saT4KLTxsaT5TZXJ2aWNlIHByb2plY3Q6IFNlbGVjdCB0aGUgcHJvamVjdCBpbiB5b3VyIHdvcmtzcGFjZSBpbnRvIHdoaWNoIEFwYWNoZSBDWEYgd2lsbCBnZW5lcmF0ZSB0aGUgY29kZS48L2xpPgotPGxpPklmIHlvdSB3aXNoIHRvIGdlbmVyYXRlIGEgY2xpZW50IGZvciB5b3VyIFdlYiBzZXJ2aWNlLCBzZWxlY3QgPGI+SmF2YSBQcm94eTwvYj4gYXMgdGhlIENsaWVudCB0eXBlOgotPHVsPgotPGxpPk1vdmUgdGhlIGNsaWVudCBzbGlkZXIgdG8gdGhlIDxiPkRldmVsb3AgY2xpZW50PC9iPiBzdGFnZS48L2xpPgotPGxpPkNsaWVudCBwcm9qZWN0OiBTZWxlY3QgYSBkaWZmZXJlbnQgcHJvamVjdCBpbnRvIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBjbGllbnQgY29kZS4gVGhlIHdpemFyZCB3aWxsIGNyZWF0ZSB0aGUgcHJvamVjdCBmb3IgeW91IGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIGNvbmZpZ3VyZSBpdCB3aXRoIHRoZSBDWEYgRmFjZXQuPC9saT4KLTwvdWw+PC9saT4KLTxsaT5QdWJsaXNoIHRoZSBXZWIgc2VydmljZTogTGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIgdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS48L2xpPgotPGxpPk1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlOiBNb25pdG9yIHRoZSBXZWIgc2VydmljZSdzIFNPQVAgdHJhZmZpYyB1c2luZyB0aGUgVENQL0lQIE1vbml0b3IuPC9saT4KLTwvb2w+PC9saT4KLTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gcGFnZToKLTxvbD4KLTxsaT5Vc2UgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTogU2VsZWN0IG9yIGNyZWF0ZSBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIChTRUkpIHRoYXQgZGVmaW5lcyB0aGUgbWV0aG9kcyB5b3Ugd2lzaCB0byBleHBvc2UgaW4gdGhlIHNlcnZpY2UuIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoLiAKLTx1bD4KLTxsaT5TZWxlY3QgYW4gU0VJOiBCcm93c2UgdG8gc2VsZWN0IGFuIGV4aXN0aW5nIFNFSS48L2xpPgotPGxpPkNyZWF0ZSBhbiBTRUk6IENyZWF0ZSBhbiBJbnRlcmZhY2UgZnJvbSB0aGUgSW1wbGVtZW50YXRpb24gYnkgcHJvdmlkaW5nIGEgbmFtZSBhbmQgdGhlIG1ldGhvZHMgdG8gZGVjbGFyZSBpbiB0aGUgZXh0cmFjdGVkIGludGVyZmFjZS48L2xpPgotPC91bD4KLUJvdGggb3B0aW9ucyBjcmVhdGUgb3IgdXBkYXRlIHRoZSA8aT5AV2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZTwvaT4gZWxlbWVudCBvbiB0aGUgaW1wbGVtZW50YXRpb24gYmVhbi4gCi08L29sPgotPC9saT4KLTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIEpBWC1XUyBhbm5vdGF0aW9ucyBjb25maWd1cmF0aW9uIHBhZ2U6Ci08cD5UaGlzIHBhZ2UgYWxsb3dzIHlvdSBhZGQgdG8gSkFYLVdTIGFubm90YXRpb25zIHRvIHRoZSBTRUkgb3IgSW1wbGVtZW50YXRpb24gKGlmIG5vdCB1c2luZyBhbiBleHBsaWNpdCBTRUkpLjwvcD4KLTxwPlRoZSBKQVgtV1MgYW5ub3RhdGlvbnMgZWxlbWVudCB2YWx1ZXMgZGVmYXVsdCB0byB0aG9zZSBvdXRsaW5lZCBpbiB0aGUgSkFYLVdTIHNwZWNpZmljYXRpb25zLjwvcD4KLTxwPklmIHRoZSBJbXBsZW1lbnRhdGlvbiBiZWFuIC8gU0VJIGNvbnRhaW5zIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGUgSkFYLVdTIGFubm90YXRpb25zIGFkZGVkIG9uIHRoaXMgcGFnZSBhZGp1c3QgdG8gcmVzb2x2ZSB0aG9zZSBjb25mbGljdHMuPC9wPjwvbGk+Ci08bGk+Q2xpY2sgPGI+TmV4dCAmZ3Q7PC9iPiB0byBtb3ZlIHRvIHRoZSBBcGFjaGUgQ1hGIGphdmEyd3MgY29uZmlndXJhdGlvbiBwYWdlIHdoaWNoIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL2phdmEyd3NfdGFiLmh0bWwiPmphdmEyd3M8L2E+IHByZWZlcmVuY2VzOgotPC9saT4KLQk8bGk+VGVzdCBXZWIgU2VydmljZSBwYWdlLiBUaGlzIHBhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIHNlcnZpY2Ugc2xpZGVyIG9uIHRoZSBmaXJzdCBwYWdlIHdhcyBzZXQgdG8gVGVzdCBzZXJ2aWNlLgotCTxwPlNlbGVjdCB0aGUgbGF1bmNoIGJ1dHRvbiB0byB0ZXN0IHRoZSBXZWIgU2VydmljZSB3aXRoIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R0ZXN0d3NkbC5odG1sIj5XZWIgU2VydmljZXMgRXhwbG9yZXI8L2E+LjwvcD4KLQk8L2xpPgotCTxsaT5BcGFjaGUgQ1hGIEpBWC1XUyBjbGllbnQgY29uZmlndXJhdGlvbiBwYWdlOiBUaGlzIHBhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIGNsaWVudCBzbGlkZXIgb24gdGhlIFdlYiBzZXJ2aWNlcyBwYWdlIHdhcyBzZXQgdG8gPGI+RGV2ZWxvcCBjbGllbnQ8L2I+LgotCTxwPlJlZmVyIHRvIHRoZSA8YSBocmVmPSIuL2NyZWF0ZV9jbGllbnQuaHRtbCI+R2VuZXJhdGUgYSBKQVgtV1MgV2ViIFNlcnZpY2UgQ2xpZW50PC9hPiBwYWdlIGZvciBpbmZvcm1hdGlvbiBvbiB0aGUgb3B0aW9ucyBkaXNwbGF5ZWQgb24gdGhpcyBwYWdlLjwvcD4KLQk8L2xpPgotCTxsaT5XZWIgU2VydmljZSBQdWJsaWNhdGlvbiBQYWdlOiBTZWxlY3Qgd2hldGhlciBvciBub3QgeW91IHdhbnQgdG8gcHVibGlzaCB0aGlzIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS4gQ2xpY2sgPGI+RmluaXNoPC9iPjwvbGk+Ci08L29sPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwiPkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2NsaWVudC5odG1sIj5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY2xpZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxZjU2MDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+R2VuZXJhdGUgYSBKQVgtV1MgV2ViIFNlcnZpY2UgQ2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvaDI+Ci08aDM+UHJlcmVxdWlzaXRlczo8L2gzPgotPG9sPgotICAgIDxsaT5JbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBlbnZpcm9ubWVudC4gU2VlIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3JlcXVpcmVtZW50cy5odG1sIj5SZXF1aXJlbWVudHMgYW5kIEluc3RhbGxhdGlvbjwvYT4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLjwvbGk+Ci0gICAgPGxpPkNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgYXMgZGVzY3JpYmVkIGhlcmU6IDxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC9hPi48L2xpPgotPC9vbD4KLVRvIGdlbmVyYXRlIGEgSkFYLVdTIGNsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudDoKLTxvbD4KLQk8bGk+U2VsZWN0IDxhIGNsYXNzPSJjb21tYW5kLWxpbmsiCi0JCWhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUob3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZS5wZXJzcGVjdGl2ZUlkPW9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSkiKSc+Ci0JPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSI+PHN0cm9uZz5XaW5kb3cgJmd0OyBPcGVuIFBlcnNwZWN0aXZlICZndDsgSmF2YSBFRTwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUgdG8gc3dpdGNoIHRvIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLjwvbGk+Ci0JPGxpPk9wZW4gdGhlIFdlYiBTZXJ2aWNlIENsaWVudCBieSBzZWxlY3RpbmcgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCkiKSc+Ci0JPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgbmV3IHdlYiBzZXJ2aWNlIGNsaWVudCB3aXphcmQiPjxzdHJvbmc+RmlsZQotCSZndDsgTmV3ICZndDsgT3RoZXIuLi4gJmd0OyBXZWIgU2VydmljZXMgJmd0OyBXZWIgU2VydmljZSBDbGllbnQ8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51LjwvbGk+Ci0JPGxpPldlYiBTZXJ2aWNlcyBwYWdlOgotCTxwPjxpbWcgc3JjPSIuL2ltYWdlcy93c19jbGllbnRfd2l6YXJkLnBuZyIgYWx0PSJXZWIgU2VydmljZXMgQ2xpZW50IFdpemFyZCI+PC9wPgotCTxvbCB0eXBlPSJhIj4KLQkgICAgPExpPkVudGVyIHRoZSBVUkkgdG8gdGhlIHJlbW90ZSBXU0RMIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsaWVudC48L0xpPgotCQk8bGk+U2VsZWN0IDxiPkphdmEgUHJveHk8L2I+IGFzIHRoZSBDbGllbnQgdHlwZS48L2xpPgotCQk8bGk+TW92ZSB0aGUgY2xpZW50IHNsaWRlciB0byB0aGUgPGI+RGV2ZWxvcCBjbGllbnQ8L2I+IHN0YWdlLjwvbGk+Ci0JCTxsaT5XZWIgc2VydmljZSBydW50aW1lOiBTZWxlY3QgQXBhY2hlIENYRiAyLng8L2xpPgotCQk8bGk+U2VydmljZSBwcm9qZWN0OiBTZWxlY3QgdGhlIHByb2plY3QgaW4geW91ciB3b3Jrc3BhY2UgaW50byB3aGljaCBBcGFjaGUgQ1hGIHdpbGwgZ2VuZXJhdGUgdGhlIGNvZGUuPC9saT4KLQk8L29sPgotCTwvbGk+Ci0JPGxpPkNsaWNrIDxiPk5leHQgJmd0OzwvYj4gdG8gbW92ZSB0byB0aGUgZmlyc3QgQXBhY2hlIENYRiB3c2RsMmphdmEgQ29uZmlndXJhdGlvbiBwYWdlOgotCTxvbD4KLQkJPGxpPk91dHB1dCBEaXJlY3Rvcnk6IFNwZWNpZnkgdGhlIHNvdXJjZSBmb2xkZXIgaW4gdGhlIHNlcnZpY2UgcHJvamVjdCBpbnRvIHdoaWNoIHRoZSBjb2RlIGlzIGdlbmVyYXRlZC48L2xpPgotCQk8bGk+UGFja2FnZSBOYW1lOiBUeXBlIHRoZSBKYXZhIHBhY2thZ2UgbmFtZSB0byB1c2UgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS48L2xpPgotCQk8bGk+U3BlY2lmeSBXU0RMIE5hbWVzcGFjZSB0byBQYWNrYWdlIE5hbWUgTWFwcGluZ3M6IE9wdGlvbmFsbHkgc3BlY2lmeSBXU0RMIG5hbWVzcGFjZSBtYXBwaW5ncyB0byBKYXZhIHBhY2thZ2UgbmFtZXMuPC9saT4KLQkJPGxpPlNlcnZpY2UgTmFtZTogU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgV1NETCBzZXJ2aWNlIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgY29kZS4gVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgZXZlcnkgc2VydmljZSBpbiB0aGUgV1NETCBkb2N1bWVudC48L2xpPgotCQk8bGk+QmluZGluZyBGaWxlczogU3BlY2lmeSBvbmUgb3IgbW9yZSBKQVgtV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzLjwvbGk+Ci0JPC9vbD4KLQk8L2xpPgotCTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIHNlY29uZCBBcGFjaGUgQ1hGIHdzZGwyamF2YSBjb25maWd1cmF0aW9uIHBhZ2Ugd2hpY2ggYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbCI+d3NkbDJqYXZhPC9hPiBkZWZhdWx0IHByZWZlcmVuY2VzOgotCTwvbGk+Ci0JPGxpPkNsaWNrIDxiPkZpbmlzaDwvYj4gdG8gZ2VuZXJhdGUgdGhlIGNsaWVudC48L2xpPgotPC9vbD4KLTxwPlRoZSBnZW5lcmF0ZWQgY2xpZW50IHdpbGwgaW5jbHVkZSBhIG1haW4oKSB0aGF0IHdoZW4gcnVuIHdpbGwgY29ubmVjdCB0byB0aGUgcmVtb3RlIHNlcnZpY2UgYW5kIGludm9rZSBldmVyeSBvcGVyYXRpb24gb24gdGhhdCByZW1vdGUgc2VydmljZS48L3A+Ci08cD5CZWZvcmUgcnVubmluZyB0aGUgY2xpZW50IG9wZW4gdGhlIGNsaWVudCBpbiB0aGUgSmF2YSBFZGl0b3IgYW5kIGVkaXQgdGhlIGdlbmVyYXRlZCBhcmd1bWVudHMgdXNlZCB0byBpbnZva2UgdGhlIG9wZXJhdGlvbnMgb24gdGhlIHNlcnZpY2UuPC9wPgotPHA+VG8gPGI+cnVuPC9iPiB0aGUgY2xpZW50IHJpZ2h0LWNsaWNrIG9uIHRoZSBjbGllbnQgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIHNlbGVjdCA8Yj5SdW4gQXMgPiBKYXZhIEFwcGxpY2F0aW9uPC9iPi4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCI+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwiPkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA4NzBhMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+Q3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXM8L2gyPgotPHA+VG8gY3JlYXRlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBhbmQgZW5hYmxlIGl0IGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHM6PGJyLz4KLTxvbD4KLTxsaT4KLVNlbGVjdCA8YSBjbGFzcz0iY29tbWFuZC1saW5rIiBocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQobmV3V2l6YXJkSWQ9b3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldC5XZWJQcm9qZWN0V2l6YXJkKSIpJz4KLTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gdGhlIG5ldyBkeW5hbWljIHdlYiBwcm9qZWN0IHdpemFyZCI+PHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgUHJvamVjdC4uLiAmZ3Q7IFdlYiAmZ3Q7IER5bmFtaWMgV2ViIFByb2plY3Q8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51Ci1lbnRlciB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgotPG9sIHR5cGU9ImEiPgotPGxpPlByb2plY3QgbmFtZTogRW50ZXIgYSBuYW1lIG9mIHRoZSBwcm9qZWN0LjwvbGk+Ci08bGk+VGFyZ2V0IFJ1bnRpbWU6IFNlbGVjdCB0aGUgc2VydmVyIHlvdSB3aXNoIHRvIGRlcGxveSB5b3VyIFdlYiBzZXJ2aWNlIHRvLiBJZiBpdCdzIG5vdCBsaXN0ZWQKLWNsaWNrIDxiPk5ldzwvYj4gYW5kIGJyb3dzZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgaXQgaXMgaW5zdGFsbGVkLjwvbGk+Ci08bGk+RHluYW1pYyBXZWIgTW9kdWxlIHZlcnNpb246IFNlbGVjdCB2ZXJzaW9uIDIuNCBvciAyLjU8L2xpPgotPGxpPkRlZmF1bHQgQ29uZmlndXJhdGlvbjogU2VsZWN0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgc2VydmVyIHR5cGUuPC9saT4KLTxsaT5FQVIgTWVtYmVyc2hpcDogSWYgZGVwbG95aW5nIHRvIEFwYWNoZSBUb21jYXQgZW5zdXJlIHRoYXQgdGhlIDxiPkFkZCBwcm9qZWN0IHRvIGFuIEVBUjwvYj4gY2hlY2sgYm94IGlzIG5vdCBzZWxlY3RlZC48L2xpPgotPGxpPkNsaWNrIEZpbmlzaDwvbGk+Ci08L29sPgotPC9saT4KLTxsaT48YSBocmVmPSIuLi90YXNrcy9pbnN0YWxsX2N4Zl9mYWNldC5odG1sIj5JbnN0YWxsIHRoZSBDWEYgUHJvamVjdCBGYWNldDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Ii4uL3Rhc2tzL21hbmFnZV9jeGZfbGliX2V4cG9ydC5odG1sIj5NYW5hZ2UgdGhlIGV4cG9ydGluZyBvZiBDWEYgbGlicmFyaWVzIGF0IGRlcGxveW1lbnQgdGltZTwvYT48L2xpPgotPC9vbD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sIj5DWEYgUHJvamVjdCBGYWNldDwvYT48YnI+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwiPkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfdG9wZG93bi5odG1sIj5HZW5lcmF0ZSBhbiBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbCI+R2VuZXJhdGUgYSBKQVgtV1MgV2ViIFNlcnZpY2UgQ2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfdG9wZG93bi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmMTA0ZTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICAgPHRpdGxlPkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L3RpdGxlPgotICAgIDxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci08aDI+R2VuZXJhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvaDI+Ci08aDM+UHJlcmVxdWlzaXRlczo8L2gzPgotPG9sPgotICAgIDxsaT5JbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBlbnZpcm9ubWVudC4gU2VlIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3JlcXVpcmVtZW50cy5odG1sIj5SZXF1aXJlbWVudHMgYW5kIEluc3RhbGxhdGlvbjwvYT4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLjwvbGk+Ci0gICAgPGxpPkNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgYXMgZGVzY3JpYmVkIGhlcmU6IDxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC9hPi48L2xpPgotCTxsaT5DcmVhdGUgb3IgaW1wb3J0IGEgV1NETCBkb2N1bWVudCBpbnRvIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgb2YgdGhlIER5bmFtaWMgV2ViIFByb2plY3QuPC9saT4KLTwvb2w+Ci08YnIvPgotVG8gY3JlYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgZW52aXJvbm1lbnQ6Ci08b2w+Ci0JPGxpPlNlbGVjdCA8YSBjbGFzcz0iY29tbWFuZC1saW5rIgotCQlocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMuc2hvd1BlcnNwZWN0aXZlKG9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUucGVyc3BlY3RpdmVJZD1vcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUpIiknPgotCTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUiPjxzdHJvbmc+V2luZG93ICZndDsgT3BlbiBQZXJzcGVjdGl2ZSAmZ3Q7IEphdmEgRUU8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51IHRvIHN3aXRjaCB0byB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZS48L2xpPgotCTxsaT5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHNlbGVjdCB0aGUgV1NETCBkb2N1bWVudCB0aGF0IHlvdSBjcmVhdGVkIG9yIGltcG9ydGVkIGludG8gdGhlIER5bmFtaWMgV2ViIFByb2plY3RzIFdlYiBDb250ZW50IGZvbGRlci48L2xpPgotICAgIDxsaT5PcGVuIHRoZSBXZWIgU2VydmljZSB3aXphcmQgYnkgc2VsZWN0aW5nIDxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZChuZXdXaXphcmRJZD1vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCkiKSc+Ci0gICAgPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgbmV3IHdlYiBzZXJ2aWNlIHdpemFyZCI+PHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgT3RoZXIuLi4gJmd0OyBXZWIgU2VydmljZXMgJmd0OyBXZWIgU2VydmljZTwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUuPC9saT4KLQk8bGk+V2ViIFNlcnZpY2VzIHBhZ2U6IHNlbGVjdCA8Yj5Ub3AgZG93biBKYXZhIGJlYW4gV2ViIFNlcnZpY2U8L2I+IGFzIHRoZSBXZWIgc2VydmljZSB0eXBlIGFuZCBicm93c2UgdG8gc2VsZWN0IHRoZSBXU0RMIGRvY3VtZW50IGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIFNFSSBhbmQgaW1wbGVtZW50YXRpb24gYmVhbjoKLQk8cD48aW1nIHNyYz0iLi9pbWFnZXMvdG9wX2Rvd25fd2l6YXJkLnBuZyIgYWx0PSJUb3AgZG93biBXZWIgU2VydmljZXMgV2l6YXJkIj48L3A+Ci0JPG9sIHR5cGU9ImEiPgotCQk8bGk+TW92ZSB0aGUgc2VydmljZSBzbGlkZXIgdG8gdGhlIHN0YWdlIG9mIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGF0IHlvdSB3aXNoIHRvIGNvbXBsZXRlLjwvbGk+Ci0JCTx1bD4KLQkJCTxsaT5EZXZlbG9wOiBJbnZva2VzIHRoZSBBcGFjaGUgQ1hGIHdzZGwyamF2YSB0b29sIHVzaW5nIHRoZSBwcmVmZXJlbmNlIGRlZmF1bHRzIGFuZCB0aGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgaW4gdGhlIHdpemFyZCB0byBnZW5lcmF0ZSBhbiBhbm5vdGF0ZWQgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgYW5kIHN1cHBvcnRpbmcgY2xhc3Nlcy4gVGhlIHdpemFyZCBhbHNvIGdlbmVyYXRlcyBhIEpBWC1XUyBlbmRwb2ludCBjb25maWd1cmF0aW9uIGZpbGUuPC9saT4KLQkJCTxsaT5Bc3NlbWJsZTogSWYgcmVxdWlyZWQgYnkgdGhlIHRhcmdldCBzZXJ2ZXIgdGhpcyBwaGFzZQotCQkJYXNzZW1ibGVzIGFuZCBjb25maWd1cmVzIHRoZSBwcm9qZWN0IHRoYXQgaG9zdHMgdGhlIFdlYiBzZXJ2aWNlIGludG8gYW4gRUFSLjwvbGk+Ci0JCQk8bGk+RGVwbG95OiBHZW5lcmF0ZXMgdGhlIGRlcGxveW1lbnQgYXJ0aWZhY3RzIGZvciB0aGUgV2ViIHNlcnZpY2UuPC9saT4KLQkJCTxsaT5JbnN0YWxsOiBJbnN0YWxscyBhbmQgY29uZmlndXJlcyB0aGUgV2ViIE1vZHVsZSBhbmQgRUFScyBvbiB0aGUgdGFyZ2V0IHNlcnZlci48L2xpPgotCQkJPGxpPlN0YXJ0OiBTdGFydHMgdGhlIHRhcmdldCBzZXJ2ZXIgb25jZSB0aGUgV2ViIHNlcnZpY2UgaGFzIGJlZW4gaW5zdGFsbGVkIG9uIGl0LjwvbGk+Ci0JCQk8bGk+VGVzdDogVXNlIHRoZSBXZWIgU2VydmljZSBFeHBsb3JlciB0byB0ZXN0IHRoZSBnZW5lcmF0ZWQgV2ViIHNlcnZpY2UuPC9saT4KLQkJPC91bD4KLQkJPGxpPlNlcnZlcjogU2VsZWN0IGEgc2VydmVyIHRvIGRlcGxveSB5b3VyIFdlYiBzZXJ2aWNlIHRvLjwvbGk+Ci0JCTxsaT5XZWIgc2VydmljZSBydW50aW1lOiBTZWxlY3QgQXBhY2hlIENYRiAyLng8L2xpPgotCQk8bGk+U2VydmljZSBwcm9qZWN0OiBTZWxlY3QgdGhlIHByb2plY3QgaW4geW91ciB3b3Jrc3BhY2UgaW50byB3aGljaCBBcGFjaGUgQ1hGIHdpbGwgZ2VuZXJhdGUgdGhlIGNvZGUuPC9saT4KLQkJPGxpPklmIHlvdSB3aXNoIHRvIGdlbmVyYXRlIGEgY2xpZW50IGZvciB5b3VyIFdlYiBzZXJ2aWNlLCBzZWxlY3QgPGI+SmF2YSBQcm94eTwvYj4gYXMgdGhlIENsaWVudCB0eXBlOgotCQk8dWw+Ci0JCQk8bGk+TW92ZSB0aGUgY2xpZW50IHNsaWRlciB0byB0aGUgPGI+RGV2ZWxvcCBjbGllbnQ8L2I+IHN0YWdlLjwvbGk+Ci0JCQk8bGk+Q2xpZW50IHByb2plY3Q6IFNlbGVjdCBhIGRpZmZlcmVudCBwcm9qZWN0IGludG8gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIGNsaWVudCBjb2RlLiBUaGUgd2l6YXJkIHdpbGwgY3JlYXRlIHRoZSBwcm9qZWN0IGZvciB5b3UgaWYgaXQgZG9lc24ndCBleGlzdCBhbmQgY29uZmlndXJlIGl0IHdpdGggdGhlIENYRiBGYWNldC48L2xpPgotCQk8L3VsPgotCQk8L2xpPgotCQk8bGk+UHVibGlzaCB0aGUgV2ViIHNlcnZpY2U6IExhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIHRvIHB1Ymxpc2ggeW91ciBXZWIgc2VydmljZSB0byBhIFVEREkgcmVnaXN0cnkuPC9saT4KLQkJPGxpPk1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlOiBNb25pdG9yIHRoZSBXZWIgc2VydmljZSdzIFNPQVAgdHJhZmZpYyB1c2luZyB0aGUgVENQL0lQIE1vbml0b3IuPC9saT4KLQk8L29sPgotCTwvbGk+Ci0JPGxpPkNsaWNrIDxiPk5leHQgJmd0OzwvYj4gdG8gbW92ZSB0byB0aGUgZmlyc3QgQXBhY2hlIENYRiB3c2RsMmphdmEgQ29uZmlndXJhdGlvbiBwYWdlOgotCTxvbD4KLQkJPGxpPk91dHB1dCBEaXJlY3Rvcnk6IFNwZWNpZnkgdGhlIHNvdXJjZSBmb2xkZXIgaW4gdGhlIHNlcnZpY2UgcHJvamVjdCBpbnRvIHdoaWNoIHRoZSBjb2RlIGlzIGdlbmVyYXRlZC48L2xpPgotCQk8bGk+UGFja2FnZSBOYW1lOiBUeXBlIHRoZSBKYXZhIHBhY2thZ2UgbmFtZSB0byB1c2UgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS48L2xpPgotCQk8bGk+U3BlY2lmeSBXU0RMIE5hbWVzcGFjZSB0byBQYWNrYWdlIE5hbWUgTWFwcGluZ3M6IE9wdGlvbmFsbHkgc3BlY2lmeSBXU0RMIG5hbWVzcGFjZSBtYXBwaW5ncyB0byBKYXZhIHBhY2thZ2UgbmFtZXMuPC9saT4KLQkJPGxpPlNlcnZpY2UgTmFtZTogU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgV1NETCBzZXJ2aWNlIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgY29kZS4gVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgZXZlcnkgc2VydmljZSBpbiB0aGUgV1NETCBkb2N1bWVudC48L2xpPgotCQk8bGk+QmluZGluZyBGaWxlczogU3BlY2lmeSBvbmUgb3IgbW9yZSBKQVgtV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzLjwvbGk+Ci0JPC9vbD4KLQk8L2xpPgotCTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIHNlY29uZCBBcGFjaGUgQ1hGIHdzZGwyamF2YSBjb25maWd1cmF0aW9uIHBhZ2Ugd2hpY2ggYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbCI+d3NkbDJqYXZhPC9hPiBkZWZhdWx0IHByZWZlcmVuY2VzOgotCTxwPkVuc3VyZSB0aGF0IHRoZSA8Yj5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvYj4gY2hlY2sgYm94IGlzIHNlbGVjdGVkIGFuZCBjbGljayA8Yj5OZXh0ICZndDs8L2I+Ci0JPC9saT4KLQk8bGk+VGVzdCBXZWIgU2VydmljZSBwYWdlLiBUaGlzIHBhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIHNlcnZpY2Ugc2xpZGVyIG9uIHRoZSBmaXJzdCBwYWdlIHdhcyBzZXQgdG8gVGVzdCBzZXJ2aWNlLgotCTxwPlNlbGVjdCB0aGUgbGF1bmNoIGJ1dHRvbiB0byB0ZXN0IHRoZSBXZWIgU2VydmljZSB3aXRoIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R0ZXN0d3NkbC5odG1sIj5XZWIgU2VydmljZXMgRXhwbG9yZXI8L2E+LjwvcD4KLQk8L2xpPgotCTxsaT5BcGFjaGUgQ1hGIEpBWC1XUyBjbGllbnQgY29uZmlndXJhdGlvbiBwYWdlOiBUaGlzIHBhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIGNsaWVudCBzbGlkZXIgb24gdGhlIFdlYiBzZXJ2aWNlcyBwYWdlIHdhcyBzZXQgdG8gPGI+RGV2ZWxvcCBjbGllbnQ8L2I+LgotCTxwPlJlZmVyIHRvIHRoZSA8YSBocmVmPSIuL2NyZWF0ZV9jbGllbnQuaHRtbCI+Q3JlYXRlIGEgSkFYLVdTIFdlYiBTZXJ2aWNlIENsaWVudDwvYT4gcGFnZSBmb3IgaW5mb3JtYXRpb24gb24gdGhlIG9wdGlvbnMgZGlzcGxheWVkIG9uIHRoaXMgcGFnZS48L3A+Ci0JPC9saT4KLQk8bGk+V2ViIFNlcnZpY2UgUHVibGljYXRpb24gUGFnZTogU2VsZWN0IHdoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRvIHB1Ymxpc2ggdGhpcyBXZWIgc2VydmljZSB0byBhIFVEREkgcmVnaXN0cnkuIENsaWNrIDxiPkZpbmlzaDwvYj48L2xpPgotPC9vbD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCI+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbCI+R2VuZXJhdGUgYSBKQVgtV1MgV2ViIFNlcnZpY2UgQ2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvYW5ub3RhdGlvbl9wcm9jZXNzaW5nLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvYW5ub3RhdGlvbl9wcm9jZXNzaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI5NTRkNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL2Fubm90YXRpb25fcHJvY2Vzc2luZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL2JvdHRvbV91cF93aXphcmQucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9ib3R0b21fdXBfd2l6YXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjdkYzNiNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL2JvdHRvbV91cF93aXphcmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9mYWNldF9jb25maWd1cmF0aW9uLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvZmFjZXRfY29uZmlndXJhdGlvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQzN2M5MWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9mYWNldF9jb25maWd1cmF0aW9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvbW9kdWxlX2RlcGVuZGVuY2llcy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL21vZHVsZV9kZXBlbmRlbmNpZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MjRhZDljLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvbW9kdWxlX2RlcGVuZGVuY2llcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL3Byb2plY3RfZmFjZXRzLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvcHJvamVjdF9mYWNldHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTE3OTk1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvcHJvamVjdF9mYWNldHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy90b3BfZG93bl93aXphcmQucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy90b3BfZG93bl93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YTcxOTFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvdG9wX2Rvd25fd2l6YXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvd3NfY2xpZW50X3dpemFyZC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL3dzX2NsaWVudF93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmNjMjJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvd3NfY2xpZW50X3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW5zdGFsbF9jeGZfZmFjZXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbnN0YWxsX2N4Zl9mYWNldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YjI4ZTkyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbnN0YWxsX2N4Zl9mYWNldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkluc3RhbGwgdGhlIENYRiBQcm9qZWN0IEZhY2V0PC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkluc3RhbGwgdGhlIENYRiBQcm9qZWN0IEZhY2V0PC9oMj4KLTxwPlRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGVuYWJsZSBhIER5bmFtaWMgV2ViIFByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQuPHA+Ci08b2w+Ci08bGk+TGV0IHRoZSBXZWIgU2VydmljZXMgd2l6YXJkcyBkbyBpdCBmb3IgeW91IGF1dG9tYXRpY2FsbHkgd2hlbiBjcmVhdGluZyBhIFdlYiBzZXJ2aWNlIHdpdGggQXBhY2hlIENYRi48L2xpPgotPGxpPlNlbGVjdCBhIENYRiBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gb3IgbW9kaWZ5IGFub3RoZXIgY29uZmlndXJhdGlvbiB3aGVuIGNyZWF0aW5nIGEgbmV3IER5bmFtaWMgV2ViIFByb2plY3QKLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9mYWNldF9jb25maWd1cmF0aW9uLnBuZyIgYWx0PSJQcm9qZWN0IENvbmZpZ3VyYXRpb24iID4gPC9wPjwvbGk+Ci08bGk+UmlnaHQtY2xpY2sgb24gYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBjaG9vc2UgPGI+UHJvcGVydGllczwvYj4gZnJvbSB0aGUgY29udGV4dCBtZW51Ljxici8+IE9uIHRoZSB0aGUgPGI+UHJvamVjdCBGYWNldHM8L2I+IAotIHByb3BlcnRpZXMgcGFnZSBzZWxlY3QgdGhlIDxiPkNYRiAyLnggV2ViIFNlcnZpY2VzPC9iPiBmYWNldCBpbiB0aGUgbGlzdCBhbmQgY2xpY2sgPGI+T0s8L2I+LgotIDxwPjxpbWcgc3JjPSIuL2ltYWdlcy9wcm9qZWN0X2ZhY2V0cy5wbmciIGFsdD0iUHJvamVjdCBGYWNldHMiID4gPC9wPjwvbGk+Ci08L29sPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwiPkNYRiBQcm9qZWN0IEZhY2V0PC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvbWFuYWdlX2N4Zl9saWJfZXhwb3J0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvbWFuYWdlX2N4Zl9saWJfZXhwb3J0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwN2Q1ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL21hbmFnZV9jeGZfbGliX2V4cG9ydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPk1hbmFnZSB0aGUgZXhwb3J0aW5nIG9mIENYRiBsaWJyYXJpZXMgYXQgZGVwbG95bWVudCB0aW1lPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPk1hbmFnZSB0aGUgZXhwb3J0aW5nIG9mIENYRiBsaWJyYXJpZXMgYXQgZGVwbG95bWVudCB0aW1lPC9oMj4KLTxwPkJ5IGRlZmF1bHQgcHJvamVjdHMgY29uZmlndXJlZCB3aXRoIHRoZSBDWEYgZmFjZXQgYXJlIHNldHVwIHRvIHJlc29sdmUgdGhlIENYRiBsaWJyYXJpZXMgdG8gdGhlIFdFQi1JTkYvbGliIGZvbGRlciBhdCBkZXBsb3ltZW50IHRpbWUuPC9wPgotPHA+VGhpcyBob3dldmVyIGdyZWF0bHkgaW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBkZXBsb3llZCB3ZWIgbW9kdWxlLiBJZiB0aGUgd2ViIG9yIGFwcGxpY2F0aW9uIHNlcnZlciB5b3UgYXJlIGRlcGxveWluZyB0byBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgd2l0aCB0aGUgQXBhY2hlIENYRiBsaWJyYXJpZXMgeW91Ci1jYW4gZGlzYWJsZSB0aGlzIG9wdGlvbiBpbiB0aGUgQXBhY2hlIENYRiBwcmVmZXJlbmNlcy48L3A+Ci08cD5UbyBlbmFibGUgb3IgZGlzYWJsZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYSBleGlzdGluZyA8Yj5EeW5hbWljIFdlYiBQcm9qZWN0PC9iPiBhbHJlYWR5IGNvbmZpZ3VyZWQgd2l0aCB0aGUgQ1hGIEZhY2V0IHJpZ2h0LWNsaWNrIG9uIHRoZSBwcm9qZWN0IGFuZCBjaG9vc2UgPGI+UHJvcGVydGllczwvYj4uPGJyLz48L3A+Ci08cD48aW1nIHNyYz0iLi9pbWFnZXMvbW9kdWxlX2RlcGVuZGVuY2llcy5wbmciIGFsdD0iTW9kdWxlIERlcGVuZGVuY2llcyI+PC9wPgotU2VsZWN0IHRoZSA8Yj5KYXZhIEVFIE1vZHVsZSBEZXBlbmRlbmNpZXM8L2I+IHByb3BlcnRpZXMgcGFnZSBhbmQgc2VsZWN0IG9yIGRlc2VsZWN0IHRoZSB2ZXJzaW9uIG9mIHRoZSA8Yj5BcGFjaGUgQ1hGIExpYnJhcnk8L2I+IHRoYXQgaXMgY29uZmlndXJlZCBpbiB0aGUgcHJvamVjdCBhbmQgY2xpY2sgPGI+T0s8L2I+LgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwiPkNYRiBQcm9qZWN0IEZhY2V0PC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY2dldHRpbmdzdGFydGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGM2YjY3NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIiBsaW5rX3RvPSJ0b2MueG1sI2dldHRpbmdzdGFydGVkIj4gCi0gICAgPHRvcGljIGxhYmVsPSJRdWljayBTdGFydCIgaHJlZj0iZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2NyZWZlcmVuY2UueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0ZmQ0YzQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iUmVmZXJlbmNlIiBsaW5rX3RvPSJ0b2MueG1sI3JlZmVyZW5jZSI+IAotCTx0b3BpYyBsYWJlbD0iUHJlZmVyZW5jZXMiIGhyZWY9InJlZmVyZW5jZS9wcmVmZXJlbmNlcy5odG1sIj4KLSAgICAgICAgPHRvcGljIGxhYmVsPSJKYXZhMldTIiBocmVmPSJyZWZlcmVuY2UvamF2YTJ3c190YWIuaHRtbCIvPgotICAgICAgICA8dG9waWMgbGFiZWw9IldTREwySmF2YSIgaHJlZj0icmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbCIvPgotICAgICAgICA8dG9waWMgbGFiZWw9IkpBWC1XUyIgaHJlZj0icmVmZXJlbmNlL2pheHdzX3RhYi5odG1sIi8+Ci0gICAgICAgIDx0b3BpYyBsYWJlbD0iRW5kcG9pbnQgQ29uZmlnIiBocmVmPSJyZWZlcmVuY2UvZW5kcG9pbnRfY29uZmlnX3RhYi5odG1sIi8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2Uvc2VydmVyX3J1bnRpbWUuaHRtbCIgbGFiZWw9IlNlcnZlciBhbmQgcnVudGltZSI+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgPC90b3BpYz4KLSA8dG9waWMgaHJlZj0icmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sIiBsYWJlbD0iQ1hGIFByb2plY3QgRmFjZXQiPgotIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2N0YXNrcy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jdGFza3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTgyOGYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2N0YXNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iVGFza3MiIGxpbmtfdG89InRvYy54bWwjdGFza3MiPiAKLQk8dG9waWMgaHJlZj0idGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwiIGxhYmVsPSJDcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzIj4KLSAgICA8dG9waWMgaHJlZj0idGFza3MvaW5zdGFsbF9jeGZfZmFjZXQuaHRtbCIgbGFiZWw9Ikluc3RhbGwgdGhlIENYRiBQcm9qZWN0IEZhY2V0Ij4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJ0YXNrcy9tYW5hZ2VfY3hmX2xpYl9leHBvcnQuaHRtbCIgbGFiZWw9Ik1hbmFnZSB0aGUgZXhwb3J0aW5nIG9mIENYRiBsaWJyYXJpZXMgZHVyaW5nIGRlcGxveW1lbnQiPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9InRhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sIiBsYWJlbD0iRW5hYmxlIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3NpbmciPgotICAgIDwvdG9waWM+Ci0gPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRiIgaHJlZj0idGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwiLz4KLSAgICA8dG9waWMgbGFiZWw9IkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiIGhyZWY9InRhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwiLz4KLSAgICA8dG9waWMgbGFiZWw9IkdlbmVyYXRlIGEgSkFYLVdTIFdlYiBTZXJ2aWNlIENsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGIiBocmVmPSJ0YXNrcy9jcmVhdGVfY2xpZW50Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjgwMDI2MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTFmOTA1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2I3ZTEzZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+DQotPHRpdGxlPkFib3V0PC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiPg0KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPg0KLSANCi08cD5GZWJydWFyeSAxOSwgMjAwOTwvcD4JDQotPGgzPkxpY2Vuc2U8L2gzPg0KLQ0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIA0KLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIA0KLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIA0KLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkNCi1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgDQotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQNCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2Jvb2suY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYm9vay5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ3ZTJiNTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYm9vay5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1AaW1wb3J0ICIuLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLXNwYW4uY29udHJvbCB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLm5hbWUgewotICBmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4uY29kZSB7Ci0gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci19Ci0KLXAubmF2X2Zvb3RlciB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXAubmF2X2Zvb3RlciBhIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2JlOTY0NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgKi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBib29rLmNzcyxcCi0gICAgICAgICAgICAgICBjb25jZXB0cy8sXAotICAgICAgICAgICAgICAgZ2V0dGluZ3N0YXJ0ZWQvLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgbWFpbnBhZ2UuaHRtbCxcCi0gICAgICAgICAgICAgICBsZWdhbC5odG1sLFwKLSAgICAgICAgICAgICAgIHRpcHMvLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZS8KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2NvbmNlcHRzL2pheHdzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9jb25jZXB0cy9qYXh3cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjk5YjcwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2NvbmNlcHRzL2pheHdzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SmF2YSBBUEkgZm9yIFhNTC1CYXNlZCBXZWIgU2VydmljZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+SmF2YSBBUEkgZm9yIFhNTC1CYXNlZCBXZWIgU2VydmljZXM8L2gyPgotPHA+SkFYLVdTIGlzIGEgSmF2YSBBUEkgZm9yIGNyZWF0aW5nIFdlYiBzZXJ2aWNlcyBhbmQgY2xpZW50cyB0aGF0IGNvbW11bmljYXRlIHVzaW5nIFhNTC4gSXQgd2FzIGRlc2lnbmVkIHRvIHN1cGVyc2VkZSB0aGUgSkFYLVJQQyBzdGFuZGFyZC48L3A+Ci0KLTxwPkFkZGl0aW9uYWwgaW5mb3JtYXRpb246PC9wPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5qY3Aub3JnL2VuL2pzci9kZXRhaWw/aWQ9MjI0Ij5KU1ItMjI0IFNwZWNpZmljYXRpb248L2E+PC9saT4KLTwvdWw+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvZ2V0dGluZ19zdGFydGVkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9nZXR0aW5nX3N0YXJ0ZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA4MmRkOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9nZXR0aW5nX3N0YXJ0ZWQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5HZXR0aW5nIFN0YXJ0ZWQ8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+R2V0dGluZyBTdGFydGVkPC9oMj4KLTxwPlRoaXMgc2VjdGlvbiBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBnZXR0aW5nIHN0YXJ0aW5nIHN0YXJ0ZWQgd2l0aCBKQVgtV1MgVG9vbHMuPC9wPgotPHVsPgotCTxsaT4KLQk8cD48YSBocmVmPSJyZXF1aXJlbWVudHMuaHRtbCI+UmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb248L2E+PC9wPgotCTwvbGk+Ci0JPGxpPgotCTxwPjxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9wcmVmZXJlbmNlcy5odG1sIj5Db25maWd1cmluZyBBcGFjaGUgQ1hGIGluIHRoZSB3b3JrYmVuY2g8L2E+PC9wPgotCTwvbGk+Ci0JPGxpPgotCTxwPjxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3F1aWNrc3RhcnQuaHRtbCI+SkFYLVdTIFRvb2xzIFF1aWNrIFN0YXJ0PC9hPjwvcD4KLQk8L2xpPgotPC91bD4KLTxwPkZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlzaXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0pBWFdTIj5KQVgtV1MgV2lraTwvYT4gcGFnZS48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcmVxdWlyZW1lbnRzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9yZXF1aXJlbWVudHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODY4N2IzZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9yZXF1aXJlbWVudHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvaDI+Ci08cD5KQVgtV1MgVG9vbHMgY3VycmVudGx5IHN1cHBvcnRzIGJvdGggRWNsaXBzZSAzLjQgYW5kIDMuNSBlbnZpcm9ubWVudHMgYW5kIGhhcyB0aGUgZm9sbG93aW5nIDxpPm1pbmltdW08L2k+IHJlcXVpcmVtZW50cy48L3A+Ci08cD48L3A+Ci08dWw+Ci0JPGxpPgotCTxwPkVjbGlwc2UgMy40LjAgKDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHM8L2E+KTwvcD4KLQk8L2xpPgotCTxsaT4KLQk8cD5FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSAzLjAuMSAoPGEgaHJlZj0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL2Rvd25sb2Fkcy8iPmh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy9kb3dubG9hZHM8L2E+KTwvcD4KLQk8L2xpPgotPC91bD4KLQotPGgzPkpESyBWZXJzaW9uczwvaDM+Ci08cD5KYXZhIDUuMCBpcyB0aGUgbWluaW11bSByZXF1aXJlZCB2ZXJzaW9uIGFuZCBKREsgNi4wIGlzIHN1cHBvcnRlZCBmcm9tIHVwZGF0ZSA0IGFuZCBsYXRlci48L3A+Ci08cD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS9kb3dubG9hZHMvIj5odHRwOi8vamF2YS5zdW4uY29tL2phdmFzZS9kb3dubG9hZHMvPC9hPjwvcD4KLQotCi08aDM+SkFYLVdTIFJ1bnRpbWU8L2gzPgotPHA+QmVmb3JlIGNyZWF0aW5nIFdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9ucyB3aXRoIEpBWC1XUyBUb29scyBhIEpBWC1XUyBydW50aW1lIG11c3QgYmUgZG93bmxvYWRlZCwgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIGluIHRoZSB3b3JrYmVuY2guPC9wPgotPHA+Q3VycmVudGx5IHdlIHN1cHBvcnQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBmb3IgSkFYLVdTIGRldmVsb3BtZW50IGZyb20gdmVyc2lvbiAyLjAuNiB1cHdhcmRzLiBXZSByZWNvbW1lbmQgdXNpbmcgYSB2ZXJzaW9uIGZyb20KLXRoZSBDWEYgMi4xLnggb3IgdGhlIGN1cnJlbnQgMi4yLnggc3RyZWFtLjwvcD4KLTxwPlRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cDovL2N4Zi5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiPkFwYWNoZSBDWEYgRG93bmxvYWRzPC9hPiBwYWdlLjxwPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbCI+QXBhY2hlIENYRiAyLnggUHJlZmVyZW5jZXM8L2E+PGJyPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvZWdnLWluY3ViYXRpb24ucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL2VnZy1pbmN1YmF0aW9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODYxYzk4MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvZWdnLWluY3ViYXRpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsYy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWxjLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTYxZTNhYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWxjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHIucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3MjZmOGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWx0LnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NGJlZTJiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL3d0cGxvZ29zbWFsbC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvd3RwbG9nb3NtYWxsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzFiZWE3Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvd3RwbG9nb3NtYWxsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2xlZ2FsLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9sZWdhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMTJmY2ZjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2xlZ2FsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5MZWdhbDwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkxlZ2FsPC9oMj4KLTxwPkNvcHlyaWdodCAmY29weTsgMjAwOSwgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvcD4KLTxwPlRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+PC9wPgotPHA+PGEgaHJlZj0iYWJvdXQuaHRtbCI+VGVybXMgYW5kIGNvbmRpdGlvbnMgcmVnYXJkaW5nIHRoZSB1c2Ugb2YgdGhpcyBndWlkZS48L2E+PC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL21haW5wYWdlLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9tYWlucGFnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMGE5OGMxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL21haW5wYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5KQVgtV1MgVG9vbHMgVXNlciBHdWlkZTwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLQk8ZGl2IGFsaWduPSJjZW50ZXIiPgotCQk8YnI+Ci0JCTxpbWcgYWx0PSJXZWJUb29scyBQbGF0Zm9ybSIgc3JjPSJpbWFnZXMvd3RwbG9nb3NtYWxsLmpwZyIgaHNwYWNlPSI3MCI+Ci0JCTxpbWcgYWx0PSJXZWJUb29scyBQbGF0Zm9ybSIgc3JjPSJpbWFnZXMvZWdnLWluY3ViYXRpb24ucG5nIiBoc3BhY2U9IjEwMCI+Ci0JCTxicj4KLQkJPGgxPkpBWC1XUyBUb29scyBVc2VyIEd1aWRlPC9oMT4KLQk8L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNThjZGIxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXBsdWdpbk5hbWU9SkFYLVdTIFRvb2xzIFVzZXIgR3VpZGUgKEluY3ViYXRpb24pDQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCi0NCi1jaGVhdHNoZWV0LmNhdGVnb3J5LmpheHdzPUpBWC1XUyBEZXZlbG9wbWVudA0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMTRjZTQ2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4NCi08cGx1Z2luPg0KLQ0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4NCi0gICAgICA8dG9jIGZpbGU9InRvYy54bWwiIHByaW1hcnk9InRydWUiLz4NCi0gICAgICA8dG9jIGZpbGU9InRvY2NvbmNlcHRzLnhtbCIvPg0KLSAgICAgIDx0b2MgZmlsZT0idG9jdGFza3MueG1sIi8+DQotICAgICAgPHRvYyBmaWxlPSJ0b2NyZWZlcmVuY2UueG1sIi8+DQotICAgPC9leHRlbnNpb24+DQotICAgDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiPg0KLSAgICAgIDxjYXRlZ29yeQ0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MiDQotICAgICAgICAgICAgbmFtZT0iJWNoZWF0c2hlZXQuY2F0ZWdvcnkuamF4d3MiPg0KLSAgICAgIDwvY2F0ZWdvcnk+DQotICAgPC9leHRlbnNpb24+DQotICAgDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2Fubm90YXRpb25fcHJvY2Vzc29ycy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2Fubm90YXRpb25fcHJvY2Vzc29ycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDIyZDE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9hbm5vdGF0aW9uX3Byb2Nlc3NvcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiPgotCTx0aXRsZT5Bbm5vdGF0aW9uIFByb2Nlc3NvcnM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+QW5ub3RhdGlvbiBWYWxpZGF0aW9uPC9oMj4KLTxwPkpBWC1XUyBUb29scyBwcm92aWRlcyBKRFQtQVBUIEFubm90YXRpb24gUHJvY2Vzc29ycyB0aGF0IGdhdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIGNvZGUgYXMgaXQgaXMgYmVpbmcgZWRpdGVkLjwvcD4KLTxwPlRoZSBwcm9jZXNzb3JzIHJlcG9ydCBlcnJvcnMgYW5kIHdhcm5pbmdzIGluIHRoZSBQcm9ibGVtcyBWaWV3IHdoZW4gSkFYLVdTIHJ1bGVzIGFyZSBicm9rZW4uPC9wPiAKLTxwPkpBWC1XUyBBbm5vdGF0aW9uIHByb2Nlc3NpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC48L3A+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY29uZmlndXJpbmdfamF4d3NfYW5ub3RhdGlvbl9wcm9jZXNzaW5nLmh0bWwiPkVuYWJsZSBKQVgtV1MgQW5ub3RhdGlvbiBQcm9jZXNzaW5nPC9hPjxicj4gICAgCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2Fubm90YXRpb25fdmlldy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2Fubm90YXRpb25fdmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYWUzZDk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9hbm5vdGF0aW9uX3ZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5Bbm5vdGF0aW9ucyBWaWV3PC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkFubm90YXRpb24gUHJvcGVydGllcyBWaWV3PC9oMj4KLTxwPkpBWC1XUyBUb29scyBwcm92aWRlcyBhIGNvbnRleHQgYXdhcmUgQW5ub3RhdGlvbiBwcm9wZXJ0aWVzIHZpZXcgdGhhdCByZWFjdHMgdG8gdGhlIHNlbGVjdGlvbiBpbiB0aGUgSmF2YSAKLUVkaXRvciBwcmVzZW50aW5nIGEgbGlzdCBvZiBhcHBsaWNhYmxlIEpBWC1XUyBhbm5vdGF0aW9ucyBmb3IgdGhhdCBzZWxlY3Rpb24uPC9wPgotPHA+U2VsZWN0aW5nIG9yIGRlc2VsZWN0aW5nIGEgY2hlY2sgYm94IGluIHRoZSB2YWx1ZXMgY29sdW1uIHdpbGwgYWRkIG9yIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhdCB0aGF0IHJvdyAKLXRvIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50IGluIHRoZSBKYXZhIEVkaXRvcjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3LnBuZyIgYWx0PSJBbm5vdGF0aW9uIHByb3BlcnRpZXMgdmlldyIgPiA8L3A+Ci08cD5FeHBhbmRpbmcgYW4gYW5ub3RhdGlvbiBpbiB0aGUgdmlldyB3aWxsIHJldmVhbCB0aGUgYW5ub3RhdGlvbnMgZWxlbWVudHMgYW5kIHRoZSBlbGVtZW50IHZhbHVlcy48L3A+Ci08cD5Zb3UgY2FuIGVkaXQgdGhlIGFubm90YXRpb24gZWxlbWVudCB2YWx1ZXMgdXNpbmcgdGhlIGVkaXRvcnMgaW4gdGhlIHZhbHVlcyBjb2x1bW4uPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2Fubm90YXRpb25zX3ZpZXdfZXhwYW5kZWQucG5nIiBhbHQ9IkFubm90YXRpb24gcHJvcGVydGllcyB2aWV3IGV4cGFuZGVkIiA+IDwvcD4KLTxwPlRoZSA8c3Ryb25nPkFubm90YXRpb24gUHJvcGVydGllczwvc3Ryb25nPiB2aWV3IGlzIGF2YWlsYWJsZSB1bmRlcgotPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkudmlld3Muc2hvd1ZpZXcob3JnLmVjbGlwc2UudWkudmlld3Muc2hvd1ZpZXcudmlld0lkPW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS52aWV3cy5Bbm5vdGF0aW9uc1ZpZXcpIiknPgotPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgYW5ub3RhdGlvbiBwcm9wZXJ0aWVzIHZpZXciPjxzdHJvbmc+V2luZG93ICZndDsgU2hvdyBWaWV3ICZndDsgT3RoZXIuLi4gJmd0OyBKQVgtV1MgJmd0OyBBbm5vdGF0aW9uIFByb3BlcnRpZXM8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51LiA8L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2Fubm90YXRpb25zX3ZpZXcucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWMzNmI5Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2Fubm90YXRpb25zX3ZpZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3X2V4cGFuZGVkLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYW5ub3RhdGlvbnNfdmlld19leHBhbmRlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5NGU1M2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3X2V4cGFuZGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvaW1hZ2VzL2NvbnRlbnRfYXNzaXN0LnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvaW1hZ2VzL2NvbnRlbnRfYXNzaXN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDA0N2YyNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL2ltYWdlcy9jb250ZW50X2Fzc2lzdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL2ltYWdlcy9xdWlja19maXhlcy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL2ltYWdlcy9xdWlja19maXhlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjYTRjMWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy9pbWFnZXMvcXVpY2tfZml4ZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy90aXBzX3RyaWNrcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy90aXBzX3RyaWNrcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmQ3MTcxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvdGlwc190cmlja3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5UaXBzIGFuZCB0cmlja3MgKEpBWC1XUyBUb29scyk8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5UaXBzIGFuZCB0cmlja3MgKEpBWC1XUyBUb29scyk8L2gyPgotPHA+VGhlIGZvbGxvd2luZyB0aXBzIGFuZCB0cmlja3MgZ2l2ZSBzb21lIGhlbHBmdWwgaWRlYXMgZm9yIGluY3JlYXNpbmcgeW91ciBwcm9kdWN0aXZpdHkuPC9wPgotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgc3VtbWFyeT0iSmF2YSBzZWFyY2ggYWN0aW9ucyI+Ci0gICAgICA8dGJvZHk+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+PGI+Q29udGVudCBBc3Npc3Q8L2I+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+Q29udGVudCBhc3Npc3QgcHJvdmlkZXMgeW91IHdpdGggYSBsaXN0IG9mIHByb3Bvc2FscyBpZiBhdmFpbGFibGUgb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGluc2VydCB0aGUgZGVmYXVsdCB2YWx1ZSBhcyBvdXRsaW5lZCBpbiB0aGUgSkFYLVdTIHNwZWNpZmljYXRpb25zIGZvciB0aGUgYW5ub3RhdGlvbnMgZWxlbWVudC4KLSAgICAgICAgICAgIEluIHRoZSBKYXZhIGVkaXRvciBwcmVzcyA8Yj5DdHJsK1NwYWNlPC9iPiBvciB1c2UgPGI+RWRpdCAmZ3Q7IENvbnRlbnQgQXNzaXN0ICAmZ3Q7IEpBWC1XUyBQcm9wb3NhbHM8L2I+IHdoZW4gdGhlIGN1cnNvciBpcyBiZXR3ZWVuIHRoZSBxdW90YXRpb24gbWFya3Mgb2YgYW4gYW5ub3RhdGlvbnMgZWxlbWVudCBTdHJpbmcgdmFsdWUKLSAgICAgICAgICAgIG9yIGRpcmVjdGx5IGFmdGVyIHRoZSAnPScgc2ltcGxlIGFzc2lnbm1lbnQgb3BlcmF0b3IuPC9wPgotICAgICAgICAgICAgPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2NvbnRlbnRfYXNzaXN0LnBuZyIgYWx0PSJDb250ZW50IEFzc2lzdCIgPiA8L3A+Ci0gICAgICAgICAgICAKLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPjxiPlVzZSBRdWljayBGaXhlcyB0byByZXNvbHZlIEpBWC1XUyB2YWxpZGF0aW9uIGVycm9yczwvYj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5XaXRoIDxiPkFubm90YXRpb24gUHJvY2Vzc2luZzwvYj4gZW5hYmxlZCBvbiBhIHByb2plY3QgdGhlIEpBWC1XUyBhbm5vdGF0aW9uIHByb2Nlc3NvcnMgcmVwb3J0IGVycm9ycyBhbmQgd2FybmluZyB3aGVuCi0gICAgICAgICAgICBydWxlcyBhcmUgYnJva2VuLiBBIG51bWJlciBvZiB0aGVzZSBydWxlcyBhcmUgcmVwb3J0ZWQgYXMgZml4YWJsZSBlcnJvcnMgYW5kIHdhcm5pbmdzLjwvcD4KLSAgICAgICAgICAgIDxwPjxpbWcgc3JjPSIuL2ltYWdlcy9xdWlja19maXhlcy5wbmciIGFsdD0iUXVpY2sgRml4ZXMiID4gPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+PGI+SW5pdGlhbGl6ZSB0aGUgV2ViIFNlcnZpY2VzIHdpemFyZHM8L2I+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+TGF1bmNoIHRoZSBXZWIgU2VydmljZSBhbmQgV2ViIFNlcnZpY2UgQ2xpZW50IHdpemFyZHMgZnJvbSB0aGUgY29udGV4dCBtZW51IHRvIGluaXRpYWxpemUgdGhlIHdpemFyZCBmaWVsZHMuIAotICAgICAgICAgICAgUmlnaHQtY2xpY2sgb24gYSBKYXZhIEltcGxlbWVudGF0aW9uIGJlYW4gYW5kIHNlbGVjdCA8Yj5XZWIgU2VydmljZXMgPiBDcmVhdGUgV2ViIFNlcnZpY2U8L2I+LiAKLSAgICAgICAgICAgIEZvciBhIFdTREwgZG9jdW1lbnQgcmlnaHQtY2xpY2sgYW5kIHNlbGVjdCA8Yj5XZWIgU2VydmljZXMgPiBHZW5lcmF0ZSBKYXZhIGJlYW4gc2tlbGV0b248L2I+LgotICAgICAgICAgICAgVGhpcyB3aWxsIGluaXRpYWxpemUgdGhlICZxdW90O1dlYiBzZXJ2aWNlIHR5cGUmcXVvdDssIHRoZSAmcXVvdDtTZXJ2aWNlIGltcGxlbWVudGF0aW9uJnF1b3Q7IG9yICZxdW90O1NlcnZpY2UgZGVmaW5pdGlvbiZxdW90OyBmaWVsZHMKLSAgICAgICAgICAgIGFuZCB0aGUgJnF1b3Q7U2VydmljZSBwcm9qZWN0JnF1b3Q7IGZpZWxkLjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90Ym9keT4KLSAgICA8L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmQ3NWRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iSkFYLVdTIFRvb2xzIFVzZXIgR3VpZGUiIHRvcGljPSJtYWlucGFnZS5odG1sIj4KLSAgIDx0b3BpYyBocmVmPSJnZXR0aW5nc3RhcnRlZC9nZXR0aW5nX3N0YXJ0ZWQuaHRtbCIgbGFiZWw9IkdldHRpbmcgU3RhcnRlZCI+Ci0gICAgICA8dG9waWMgaHJlZj0iZ2V0dGluZ3N0YXJ0ZWQvcmVxdWlyZW1lbnRzLmh0bWwiIGxhYmVsPSJSZXF1aXJlbWVudHMgYW5kIEluc3RhbGxhdGlvbiIvPgotICAgICAgPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY2dldHRpbmdzdGFydGVkLnhtbCIvPgotICAgICAgPGFuY2hvciBpZD0iZ2V0dGluZ3N0YXJ0ZWQiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNvbmNlcHRzIj4KLSAgICAgIDxhbmNob3IgaWQ9ImNvbmNlcHRzIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJUYXNrcyI+Ci0gICAgICA8YW5jaG9yIGlkPSJ0YXNrcyIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iUmVmZXJlbmNlIj4KLSAgICAgIDxhbmNob3IgaWQ9InJlZmVyZW5jZSIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBocmVmPSJ0aXBzL3RpcHNfdHJpY2tzLmh0bWwiIGxhYmVsPSJUaXBzIGFuZCB0cmlja3MiPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBocmVmPSJsZWdhbC5odG1sIiBsYWJlbD0iTGVnYWwiPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jY29uY2VwdHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jY29uY2VwdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwODY1Y2M0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY2NvbmNlcHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IkNvbmNlcHRzIiBsaW5rX3RvPSJ0b2MueG1sI2NvbmNlcHRzIj4KLSAgIDx0b3BpYyBocmVmPSJjb25jZXB0cy9qYXh3cy5odG1sIiBsYWJlbD0iSmF2YSBBUEkgZm9yIFhNTC1CYXNlZCBXZWIgU2VydmljZXMiPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jcmVmZXJlbmNlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkMGExYzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJSZWZlcmVuY2UiIGxpbmtfdG89InRvYy54bWwjcmVmZXJlbmNlIj4KLSAgIDxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2NyZWZlcmVuY2UueG1sIi8+Ci0gICA8dG9waWMgaHJlZj0icmVmZXJlbmNlL2Fubm90YXRpb25fcHJvY2Vzc29ycy5odG1sIiBsYWJlbD0iQW5ub3RhdGlvbiBWYWxpZGF0aW9uIj4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgaHJlZj0icmVmZXJlbmNlL2Fubm90YXRpb25fdmlldy5odG1sIiBsYWJlbD0iQW5ub3RhdGlvbiBQcm9wZXJ0aWVzIFZpZXciPgotICAgPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3Rhc2tzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3Rhc2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzBjZGJjNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2N0YXNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJUYXNrcyIgbGlua190bz0idG9jLnhtbCN0YXNrcyI+Ci0gICA8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jdGFza3MueG1sIi8+IAotPC90b2M+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOGRmOWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlMTllNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjc5YzkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1DWEYgV2ViIFNlcnZpY2VzIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUNYRiBXZWIgU2VydmljZXMgCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWVwbC12MTAuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNjJjOTAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjAuNC4yLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmpkb20iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIxNTYiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iNDQiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjIwNCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iNTIiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSI5NiIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjEyMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgud3NkbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjYuMi5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODY0NzI3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgZmVhdHVyZSBkZXRhaWxzIGluIHRoZSAiQWJvdXQiIAotIyBkaWFsb2cgKHRyYW5zbGF0ZWQpLiAgTWF4aW11bSAxNSBsaW5lcyBhbmQgNzUgY2hhcmFjdGVycyBwZXIgbGluZS4KLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWN4ZjMyLmdpZgotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxMzUyZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9Q1hGIFdlYiBTZXJ2aWNlcyBTb3VyY2UgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBJT05BIFRlY2hub2xvZ2llcyBQTEMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2luY3ViYXRvci9cblwKLVxuCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQzNDRkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBjeGYzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2N4ZjMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9jeGYzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMWVjY2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2N4ZjMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhOWQwMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBTb3VyY2UgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGUxOWU1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhYzgxNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1DWEYgV2ViIFNlcnZpY2VzIERldmVsb3BlciBSZXNvdXJjZXMgKEluY3ViYXRpb24pCi0KLSMgImZlYXR1cmVQcm92aWRlciIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLWZlYXR1cmVQcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgZm9yIENYRiBXZWIgU2VydmljZXMKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTENcblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODY0NzI3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgZmVhdHVyZSBkZXRhaWxzIGluIHRoZSAiQWJvdXQiIAotIyBkaWFsb2cgKHRyYW5zbGF0ZWQpLiAgTWF4aW11bSAxNSBsaW5lcyBhbmQgNzUgY2hhcmFjdGVycyBwZXIgbGluZS4KLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWN4ZjMyLmdpZgotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxMzUyZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9Q1hGIFdlYiBTZXJ2aWNlcyBTb3VyY2UgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBJT05BIFRlY2hub2xvZ2llcyBQTEMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2luY3ViYXRvci9cblwKLVxuCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQzNDRkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBjeGYzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2N4ZjMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9jeGYzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMWVjY2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2N4ZjMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhMmU1OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1DWEYgV2ViIFNlcnZpY2VzIFNvdXJjZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyNTFjZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmOGI3Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZQotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2Yjc5Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1DWEYgV2ViIFNlcnZpY2VzIFNESyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1DWEYgV2ViIFNlcnZpY2VzIFNvdXJjZQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQ1xuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NjYwNjguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMC40LjIucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGZkNzJhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTE5ZTUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGJmN2IxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBUZXN0cyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1DWEYgV2ViIFNlcnZpY2VzIFRlc3RzCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWVwbC12MTAuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzRkNjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjAuNC4yLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkOWMzMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTM3ODkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2MjI3Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlIgotICAgICAgbGFiZWw9IkFzc2VtYmx5IEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJXZWJ0b29scyBQbGF0Zm9ybSBQcm9qZWN0Ij4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyBmZWF0dXJlIGlzIGZvciBidWlsZGluZyBvbmx5LCB0byBhc3NlbWJsZSB0aGUgcmVsZWF0ZWQgZmVhdHVyZXMsIHdpdGhvdXQgZm9yY2VpbmcgdGhlbSB0byBlbmNvZGluZyBkZXBlbmRlbmNpZXMgb24gZWFjaCBvdGhlci4gCi1UaGlzIGZlYXR1cmUgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBidWlsZCBkaXN0cmlidXRpb25zIG9yIHVwZGF0ZSBzaXRlcy4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E4OTYyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTM3ODkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhOGExZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iQXNzZW1ibHkgRmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IldlYnRvb2xzIFBsYXRmb3JtIFByb2plY3QiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICBUaGlzIGZlYXR1cmUgaXMgZm9yIGJ1aWxkaW5nIG9ubHksIHRvIGFzc2VtYmxlIHRoZSByZWxlYXRlZCBmZWF0dXJlcywgd2l0aG91dCBmb3JjZWluZyB0aGVtIHRvIGVuY29kaW5nIGRlcGVuZGVuY2llcyBvbiBlYWNoIG90aGVyLiAKLVRoaXMgZmVhdHVyZSBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIGJ1aWxkIGRpc3RyaWJ1dGlvbnMgb3IgdXBkYXRlIHNpdGVzLgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwM2RiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTM3ODkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxN2M1NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IkFzc2VtYmx5IEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJXZWJ0b29scyBQbGF0Zm9ybSBQcm9qZWN0Ij4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyBmZWF0dXJlIGlzIGZvciBidWlsZGluZyBvbmx5LCB0byBhc3NlbWJsZSB0aGUgcmVsZWF0ZWQgZmVhdHVyZXMsIHdpdGhvdXQgZm9yY2VpbmcgdGhlbSB0byBlbmNvZGluZyBkZXBlbmRlbmNpZXMgb24gZWFjaCBvdGhlci4gCi1UaGlzIGZlYXR1cmUgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBidWlsZCBkaXN0cmlidXRpb25zIG9yIHVwZGF0ZSBzaXRlcy4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMgCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8aW5jbHVkZXMgCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMGZhMjVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5OWVhNGIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwNCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwNCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXA0KLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sDQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmIzMDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SkFYLVdTIERPTSBUb29scyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KQVgtV1MgRE9NIFRvb2xzCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVdlYiBUb29scyAoV1RQKSBVcGRhdGUgU2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA5IFNBUCBBRywgV2FsbGRvcmYuXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWVwbC12MTAuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmNzUyMDQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIgdmVyc2lvbj0iMS4xLjIwMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmplZS51aSIgdmVyc2lvbj0iMS4wLjEwMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzIiB2ZXJzaW9uPSIxLjAuMzA0IiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MiIHZlcnNpb249IjEuMS4xIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIgdmVyc2lvbj0iMi4wLjEwMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mIiB2ZXJzaW9uPSIyLjUuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIgdmVyc2lvbj0iMi41LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIgdmVyc2lvbj0iMi41LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIiB2ZXJzaW9uPSIzLjUuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjMuNS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIgdmVyc2lvbj0iMy41LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uIiB2ZXJzaW9uPSIxLjMuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIgdmVyc2lvbj0iMy41LjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UiIHZlcnNpb249IjMuNS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiIHZlcnNpb249IjMuNS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS50ZXh0IiB2ZXJzaW9uPSIzLjUuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIiB2ZXJzaW9uPSIzLjUuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiIHZlcnNpb249IjEuNC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLmF4aXMiIHZlcnNpb249IjEuNC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTBhZmIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDE1LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmVmZWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzJkZWFjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SkFYLVdTIERPTSBUb29scyBTb3VyY2UgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBTQVAgQUcsIFdhbGxkb3JmLiAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvaW5jdWJhdG9yL1xuXAotXG4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTJjMTQ3Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTGFuZ3VhZ2UgRmlsZSBmb3IgdGhpcyBQbHVnaW4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBHZW5lcmljIExhYmVsIGFuZCBEZXNjcmlwdGlvbg0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIERPTSBUb29scyBTb3VyY2UgKEluY3ViYXRpb24pDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5OWVhNGIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcDQotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcDQotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwNCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDM1YzMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpBWC1XUyBET00gVG9vbHMgRGV2ZWxvcGVyIFJlc291cmNlcyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBmb3IgSkFYLVdTIERPTSBUb29scwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1XZWIgVG9vbHMgKFdUUCkgVXBkYXRlIFNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOSBTQVAgQUcsIFdhbGxkb3JmLlxuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTBhZmIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDE1LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmVmZWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzJkZWFjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SkFYLVdTIERPTSBUb29scyBTb3VyY2UgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBTQVAgQUcsIFdhbGxkb3JmLiAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvaW5jdWJhdG9yL1xuXAotXG4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTJjMTQ3Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTGFuZ3VhZ2UgRmlsZSBmb3IgdGhpcyBQbHVnaW4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBHZW5lcmljIExhYmVsIGFuZCBEZXNjcmlwdGlvbg0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIERPTSBUb29scyBTb3VyY2UgKEluY3ViYXRpb24pDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRkNmU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhMmE2YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiNjE1ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SkFYLVdTIERPTSBUb29scyBTREsgKEluY3ViYXRpb24pCi0KLSMgImZlYXR1cmVQcm92aWRlciIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLWZlYXR1cmVQcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SkFYLVdTIERPTSBUb29scyBTb3VyY2UKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIChXVFApIFVwZGF0ZSBTaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDkgU0FQIEFHLCBXYWxsZG9yZi5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGVhNmZkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxOTJhNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTNmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1MWM3My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KQVgtV1MgRE9NIFRvb2xzIFRlc3RzIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpBWC1XUyBET00gVG9vbHMgVGVzdHMKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIChXVFApIFVwZGF0ZSBTaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDkgU0FQIEFHLCBXYWxsZG9yZi5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxNDU4NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5qbW9jayIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWI4OGViLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjkzZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZWNlZDkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SkFYLVdTIFRvb2xzIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpBWC1XUyBUb29scyAKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLlxuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkNmM4YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjAuNS4yLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgueG1sLndzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMS4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4Lmp3cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgueG1sLmJpbmQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4xLjkucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgueG1sLnN0cmVhbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LmFjdGl2YXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAxOSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmZWZlYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgZmVhdHVyZSBkZXRhaWxzIGluIHRoZSAiQWJvdXQiIAotIyBkaWFsb2cgKHRyYW5zbGF0ZWQpLiAgTWF4aW11bSAxNSBsaW5lcyBhbmQgNzUgY2hhcmFjdGVycyBwZXIgbGluZS4KLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzYxNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SkFYLVdTIFRvb2xzIFNvdXJjZSAoSW5jdWJhdGlvbilcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOCwgMjAwOS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2luY3ViYXRvci9cblwKLVxuCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTdmMWNiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9SkFYLVdTIFRvb2xzIFNvdXJjZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5M2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDNhOGIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KQVgtV1MgVG9vbHMgRGV2ZWxvcGVyIFJlc291cmNlcyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBmb3IgSkFYLVdTIFRvb2xzIAotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMuXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWVwbC12MTAuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAxOSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmZWZlYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgZmVhdHVyZSBkZXRhaWxzIGluIHRoZSAiQWJvdXQiIAotIyBkaWFsb2cgKHRyYW5zbGF0ZWQpLiAgTWF4aW11bSAxNSBsaW5lcyBhbmQgNzUgY2hhcmFjdGVycyBwZXIgbGluZS4KLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzYxNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9SkFYLVdTIFRvb2xzIFNvdXJjZSAoSW5jdWJhdGlvbilcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOCwgMjAwOS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2luY3ViYXRvci9cblwKLVxuCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OThhZWJlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNwcm9wZXJ0aWVzIGZpbGUgZm9yIEpBWFdTIENvcmUKLXBsdWdpbk5hbWU9SkFYLVdTIFRvb2xzIFNvdXJjZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyMzUzMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGEyYThjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmMjM5Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SkFYLVdTIFRvb2xzIFNESyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KQVgtV1MgVG9vbHMgU291cmNlCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyYjI3MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMC41LjIucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjE2NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjUwMjYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlMmFlZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KQVgtV1MgVG9vbHMgVGVzdHMgKEluY3ViYXRpb24pCi0KLSMgImZlYXR1cmVQcm92aWRlciIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLWZlYXR1cmVQcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SkFYLVdTIFRvb2xzIFRlc3RzCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZDlhYTUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIwLjUuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlZmVhdHVyZVByb3ZpZGVyIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzRmNzY5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjUwMjYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwNGU5Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SkFYLVdTIFRvb2xzIFVzZXIgRG9jdW1lbnRhdGlvbiAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KQVgtV1MgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLlxuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzI2ZWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMC41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDQ1YjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1MmYwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBKYW4gMTAgMDk6MjA6NTQgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQxNWQzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzAuNS4wLDAuNi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzAuMS4wLDAuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGY5MGQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTA0MjQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzCi1CdW5kbGUtTmFtZS4wID0gVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jeGYvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTJmMzJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jeGYvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy5KQVhCQ29yZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHMuSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy5KQVhXU0NvcmVUZXN0U3VpdGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzcGVjaWZpZXMgYWxsIHRoZSBidW5kbGVzIG9mIHRoaXMgY29tcG9uZW50IHRoYXQgcHJvdmlkZSBhIHRlc3QKLSAqIHN1aXRlIHRvIHJ1biBkdXJpbmcgYXV0b21hdGVkIHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0c1N1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCi0JcHVibGljIEFsbFRlc3RzU3VpdGUoKSB7Ci0JCXN1cGVyKCJBbGwgSkFYV1MgYW5kIEpBWEIgVGVzdCBTdWl0ZXMiKTsKLQkJYWRkVGVzdChKQVhXU0NvcmVUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChKQVhCQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQotCQkvL0FkZGluZyBKQVgtV1MgRE9NIFRvb2xzIHRlc3Qgc3VpdGVzCi0gICAgICAgIGFkZFRlc3Qob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5kb20uQWxsVGVzdHNTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuQWxsVGVzdHNTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLkFsbFRlc3RzU3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3Qob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLkFsbFRlc3RzU3VpdGUuc3VpdGUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBqdXN0IG5lZWQgdG8gcnVuIGluIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgd29ya2JlbmNoLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBbGwoKSB7Ci0JCS8vIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGV4aXN0LCBidXQgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcKLQkJLy8gb3RoZXIgdGhhbiB0byBzaWduYWwgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JCS8vIFRoZSByZXN0IGl0IGF1dG9tYXRpYyBmcm9tIHRoZSB0ZXN0cyBhZGRlZCBpbiBjb25zdHJ1Y3Rvci4KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jeGYvdGVzdHMvRWFzeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jeGYvdGVzdHMvRWFzeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyZTcwNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0Vhc3lUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBFYXN5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIHNpbXBsZSB0ZXN0IGp1c3QgdG8gYWx3YXlzIHN1Y2NlZWQgdG8gZGVtb25zdHJhdGUgdGVzdHMgYXJlIGJlaW5nIGNhbGxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RUaGF0VGVzdHNSdW4oKSB7Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YmFmZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QKLSAgICBuYW1lPSJ0ZXN0c3VpdGUiCi0gICAgZGVmYXVsdD0icnVuIgotICAgIGJhc2VkaXI9Ii4iPgotCi0gICAgPCEtLSAKLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQKLSAgICAgICAgIHNvIHdlJ2xsIGZhaWwgZmFzdCBpZiBub3QuIAotICAgICAgICAgICAgICR7ZWNsaXBzZS1ob21lfSAgIAotICAgICAgICAgICAgICR7YnVpbGREaXJlY3Rvcnl9Ci0gICAgICAgICAgICAgJHtidWlsZExhYmVsfSAgICAgICAgCi0gICAgLS0+Ci0gIAotICAJPGZhaWwKLSAgICAgICAgbWVzc2FnZT0iRXJyb3I6IG1pc3NpbmcgcHJvcGVydHkuIGVjbGlwc2UtaG9tZSBtdXN0IGJlIHByb3ZpZGVkIgotICAgICAgICB1bmxlc3M9ImVjbGlwc2UtaG9tZSIgLz4KLSAgICA8ZmFpbAotICAgICAgICBtZXNzYWdlPSJFcnJvcjogbWlzc2luZyBwcm9wZXJ0eS4gYnVpbGREaXJlY3RvcnkgbXVzdCBiZSBwcm92aWRlZCIKLSAgICAgICAgdW5sZXNzPSJidWlsZERpcmVjdG9yeSIgLz4KLSAgICA8ZmFpbAotICAgICAgICBtZXNzYWdlPSJFcnJvcjogbWlzc2luZyBwcm9wZXJ0eS4gYnVpbGRMYWJlbCBtdXN0IGJlIHByb3ZpZGVkIgotICAgICAgICB1bmxlc3M9ImJ1aWxkTGFiZWwiIC8+Ci0JCi0gICAgPCEtLSBzaG91bGQgYmUgbGl0dGxlIG5lZWQgdG8gY2hhbmdlIHdoYXQncyBhYm92ZSAgLS0+Ci0JCi0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9InBsdWdpbi1uYW1lIgotICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cyIvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJjbGFzc25hbWUiCi0gICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLkFsbFRlc3RzU3VpdGUiLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0idGVzdFR5cGUiCi0gICAgICAgIHZhbHVlPSJ1aS10ZXN0Ii8+Ci0KLSAgICA8IS0tIHNob3VsZCBiZSBsaXR0bGUgbmVlZCB0byBjaGFuZ2Ugd2hhdCdzIGJlbG93IC0tPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImJhc2VkaXI6ICR7YmFzZWRpcn0iLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJlY2xpcHNlLWhvbWU6ICR7ZWNsaXBzZS1ob21lfSIvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImJ1aWxkRGlyZWN0b3J5OiAke2J1aWxkRGlyZWN0b3J5fSIvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9InBsdWdpbi1uYW1lOiAke3BsdWdpbi1uYW1lfSIvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImNsYXNzbmFtZTogJHtjbGFzc25hbWV9Ii8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0idGVzdFR5cGUgJHt0ZXN0VHlwZX0iLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJ3b3Jrc3BhY2UiCi0gICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanVuaXR3b3Jrc3BhY2VzLyR7cGx1Z2luLW5hbWV9Ii8+Ci0JICA8ZWNobyAKLQkgICAgICBtZXNzYWdlPSJ3b3Jrc3BhY2U6ICR7d29ya3NwYWNlfSIgLz4KLSAgICA8IS0tCi0gICAgICAgIFRoaXMgaW5pdCB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lCi0gICAgICAgIGZvciBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbAotICAgICAgICB0ZXN0cyBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gCi0gICAgLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHRzdGFtcC8+Ci0gICAgICAgIDxkZWxldGU+Ci0gICAgICAgICAgICA8ZmlsZXNldAotICAgICAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9IgotICAgICAgICAgICAgICAgIGluY2x1ZGVzPSIke3BsdWdpbi1uYW1lfS4qeG1sIi8+Ci0gICAgICAgIDwvZGVsZXRlPgotICAgICAgICA8IS0tIG1ha2UgZGlyZWN0b3J5LCBpbiBjYXNlIHBhdGggZG9lc24ndCBleGlzdCB5ZXQgLS0+Ci0gICAgICAgIDxta2RpcgotICAgICAgICAgICAgZGlyPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgICAgPCEtLSAgYnV0IGRlbGV0ZSB0byBtYWtlIHN1cmUgZnJlc2ggY29udGVudHMtLT4KLSAgICAgICAgPGRlbGV0ZQotICAgICAgICAgICAgZGlyPSIke3dvcmtzcGFjZX0iCi0gICAgICAgICAgICBxdWlldD0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9InN1aXRlIj4KLSAgICAgICAgPGFudAotICAgICAgICAgICAgdGFyZ2V0PSIke3Rlc3RUeXBlfSIKLSAgICAgICAgICAgIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIKLSAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9ImRhdGEtZGlyIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9InBsdWdpbi1uYW1lIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0iY2xhc3NuYW1lIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke2NsYXNzbmFtZX0iLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9InBsdWdpbi1wYXRoIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgICAgICA8L2FudD4KLSAgICAgICAgPGNvcHkKLSAgICAgICAgICAgIGZhaWxvbmVycm9yPSJmYWxzZSIKLSAgICAgICAgICAgIGZpbGU9IiR7d29ya3NwYWNlfS8ubWV0YWRhdGEvLmxvZyIKLSAgICAgICAgICAgIHRvZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZExhYmVsfS90ZXN0UmVzdWx0cy9jb25zb2xlbG9ncy8ke3BsdWdpbi1uYW1lfS5jb25zb2xlbG9nLnR4dCIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gICAgPCEtLQotICAgICAgICBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvCi0gICAgLS0+Ci0gICAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0iY2xlYW51cCI+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIHVzdWFsbHkgbm8gbmVlZCB0byBkZWxldGUgd29ya3NwYWNlIHVudGlsIG5leHQgcnVuLCBhbmQKLSAgICAgICAgICAgIGxlYXZpbmcgaXQgYWxsb3dzIGluc3BlY3Rpb24KLSAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiIC8+IC0tPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0KLSAgICAgICAgVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbgotICAgIC0tPgotICAgIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9InJ1biIKLSAgICAgICAgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICAgICAgPGFudAotICAgICAgICAgICAgdGFyZ2V0PSJjb2xsZWN0IgotICAgICAgICAgICAgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IgotICAgICAgICAgICAgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0iaW5jbHVkZXMiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Lip4bWwiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9Im91dHB1dC1maWxlIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICAgICAgPC9hbnQ+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVlNGFkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQwMDIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVGh1IE1heSAwNyAxNTo0MDoyMyBJU1QgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmZiOTYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDAuMS4xLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5iaW5kO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb247dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVyczt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC5hdHRhY2htZW50O3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmhlbHBlcnM7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQudXRpbDt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkM2JjNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhN2VhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI3Byb3BlcnRpZXMgZmlsZSBmb3IgSkFYQiBUb29scyBUZXN0cwotcGx1Z2luTmFtZT1KQVhCIFRvb2xzIFRlc3RzIChJbmN1YmF0aW9uKQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ4MTU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TaGFyZWRBU1RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUGVyZm9ybUNoYW5nZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgdGVzdEphdmFQcm9qZWN0OwotICAgIHByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdDsKLSAgICBwcm90ZWN0ZWQgQVNUIGFzdDsKLSAgICBwcm90ZWN0ZWQgQVNUUmV3cml0ZSByZXdyaXRlcjsKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotICAgIHByb3RlY3RlZCBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZTsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0SmF2YVByb2plY3QgPSBuZXcgVGVzdEphdmFQcm9qZWN0KCJKYXZhUHJvamVjdCIpOwotICAgICAgICB0ZXN0SmF2YVByb2plY3Quc2V0QXV0b0J1aWxkaW5nKGlzQXV0b0J1aWxkaW5nRW5hYmxlZCgpKTsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0LmVuYWJsZUFubm90YXRpb25Qcm9jZXNzaW5nKGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkpOwotCi0gICAgICAgIHNvdXJjZSA9IHRlc3RKYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoZ2V0UGFja2FnZU5hbWUoKSwgZ2V0Q2xhc3NOYW1lKCksIGdldENsYXNzQ29udGVudHMoKSk7Ci0gICAgICAgIAotICAgICAgICBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIGFzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKTsKLSAgICAgICAgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotICAgICAgICBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbigpOwotICAgICAgICB0ZXh0RmlsZUNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQWRkIGFubm90YXRpb24iLCAoSUZpbGUpIHNvdXJjZS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBdXRvQnVpbGRpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc05hbWUoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIENoYW5nZSBjaGFuZ2UpIHsKLSAgICAgICAgaWYgKGNoYW5nZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotCi0gICAgICAgIFBlcmZvcm1DaGFuZ2VPcGVyYXRpb24gY2hhbmdlT3BlcmF0aW9uID0gbmV3IFBlcmZvcm1DaGFuZ2VPcGVyYXRpb24oY2hhbmdlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2hhbmdlT3BlcmF0aW9uLnJ1bihtb25pdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoYW5nZU9wZXJhdGlvbi5jaGFuZ2VFeGVjdXRlZCgpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlkZWxldGVQcm9qZWN0KHRlc3RKYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgIAkKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAJaW50IG5vQXR0ZW1wdHMgPSAwOwotICAgIAl3aGlsZSAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgJiYgbm9BdHRlbXB0cyA8IDUpIHsKLSAgICAJCXRyeSB7Ci0gICAgCQkJbm9BdHRlbXB0cysrOwotICAgIAkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0gICAgCQkJCXByb2plY3QuY2xvc2UobnVsbCk7ICAgIAkJCQkKLSAgICAJCQl9Ci0gICAgCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgCQl9IGNhdGNoIChSZXNvdXJjZUV4Y2VwdGlvbiByZSkgewotICAgIAkJCVN5c3RlbS5vdXQucHJpbnRsbihyZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgIAkJCVRocmVhZC5zbGVlcCgxKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9QYWNrYWdlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9QYWNrYWdlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTZkOTFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvUGFja2FnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgQWRkQW5ub3RhdGlvblRvUGFja2FnZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gInBhY2thZ2UtaW5mby5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIHJldHVybiAicGFja2FnZSBjb20uZXhhbXBsZTtcbiI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbG9jYXRpb25WUCA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJsb2NhdGlvbiIsICJ1cmk6c29tZVNjaGVtYSIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lc3BhY2VWUCA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJuYW1lc3BhY2UiLCAidXJpOnRlc3ROUyIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGxvY2F0aW9uVlApOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lc3BhY2VWUCk7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgWG1sU2NoZW1hLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb25Ub1BhY2thZ2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFhtbFNjaGVtYS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICBJUGFja2FnZURlY2xhcmF0aW9uIG15UGFja2FnZSA9IHNvdXJjZS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG15UGFja2FnZSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChteVBhY2thZ2UsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG15UGFja2FnZSwgWG1sU2NoZW1hLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChteVBhY2thZ2UsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFhtbFNjaGVtYS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0pBWEJDb3JlVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0pBWEJDb3JlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZWEwMTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9KQVhCQ29yZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBPaXNpbiBIdXJsZXkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpBWEJDb3JlVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCQ29yZVRlc3RTdWl0ZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSkFYQkNvcmVUZXN0U3VpdGUoKSB7Ci0gICAgICAgIHN1cGVyKCJKQVhCIENvcmUgVGVzdHMiKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZEFubm90YXRpb25Ub1BhY2thZ2VUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFJlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZVRlc3QuY2xhc3MpOyAgICAKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21QYWNrYWdlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGFhZDcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21QYWNrYWdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uRnJvbVBhY2thZ2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJwYWNrYWdlLWluZm8uamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigiQFhtbFNjaGVtYVxuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hO1xuXG4iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBYbWxTY2hlbWEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbkZyb21QYWNrYWdlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhYbWxTY2hlbWEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgSVBhY2thZ2VEZWNsYXJhdGlvbiBteVBhY2thZ2UgPSBzb3VyY2UuZ2V0UGFja2FnZURlY2xhcmF0aW9uKGdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChteVBhY2thZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG15UGFja2FnZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQobXlQYWNrYWdlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChteVBhY2thZ2UsIFhtbFNjaGVtYS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG15UGFja2FnZSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShzb3VyY2UuZ2V0SW1wb3J0KFhtbFNjaGVtYS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdEphdmFQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjRmYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLnV0aWwuQXB0Q29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SmF2YVByb2plY3QgZXh0ZW5kcyBUZXN0UHJvamVjdCB7Ci0gICAgcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0gICAgCi0gICAgcHVibGljIFRlc3RKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIocHJvamVjdE5hbWUpOwotICAgICAgICBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KCkpOwotICAgICAgICBhZGRQcm9qZWN0TmF0dXJlKGdldFByb2plY3QoKSwgSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQotICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3IElDbGFzc3BhdGhFbnRyeVswXSwgbnVsbCk7Ci0KLSAgICAgICAgY3JlYXRlU291cmNlRm9sZGVyKCk7Ci0gICAgICAgIGFkZFRvQ2xhc3NwYXRoKGphdmFQcm9qZWN0LCBnZXRKUkVDb250YWluZXJFbnRyeSgpKTsKLSAgICAgICAgY3JlYXRlT3V0cHV0Rm9sZGVyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9CdWlsZGluZyhib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgZGVzY3JpcHRpb24uc2V0QXV0b0J1aWxkaW5nKGF1dG9CdWlsZCk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUFubm90YXRpb25Qcm9jZXNzaW5nKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIEFwdENvbmZpZy5zZXRFbmFibGVkKGphdmFQcm9qZWN0LCBlbmFibGUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElDbGFzc3BhdGhFbnRyeSBnZXRKUkVDb250YWluZXJFbnRyeSgpIHsKLSAgICAgICAgSVZNSW5zdGFsbCBkZWZhdWx0Vk1JbnN0YWxsID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotICAgICAgICBpZiAoZGVmYXVsdFZNSW5zdGFsbCAhPSBudWxsICYmIGlzSmF2YTZPckdyZWF0ZXJKUkUoZGVmYXVsdFZNSW5zdGFsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBKYXZhUnVudGltZS5nZXREZWZhdWx0SlJFQ29udGFpbmVyRW50cnkoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSVZNSW5zdGFsbFR5cGVbXSBpbnN0YWxsVHlwZXMgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlcygpOwotICAgICAgICBmb3IgKElWTUluc3RhbGxUeXBlIGluc3RhbGxUeXBlIDogaW5zdGFsbFR5cGVzKSB7Ci0gICAgICAgICAgICBJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IGluc3RhbGxUeXBlLmdldFZNSW5zdGFsbHMoKTsKLSAgICAgICAgICAgIGZvciAoSVZNSW5zdGFsbCB2bUluc3RhbGwgOiB2bUluc3RhbGxzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzSmF2YTZPckdyZWF0ZXJKUkUodm1JbnN0YWxsKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoSmF2YVJ1bnRpbWUubmV3SlJFQ29udGFpbmVyUGF0aChpbnN0YWxsVHlwZS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtSW5zdGFsbC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBKYXZhUnVudGltZS5nZXREZWZhdWx0SlJFQ29udGFpbmVyRW50cnkoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSmF2YTZPckdyZWF0ZXJKUkUoSVZNSW5zdGFsbCB2bUluc3RhbGwpIHsKLSAgICAgICAgaWYgKHZtSW5zdGFsbCBpbnN0YW5jZW9mIElWTUluc3RhbGwyKSB7Ci0gICAgICAgICAgICBJVk1JbnN0YWxsMiB2bUluc3RhbGwyID0gKElWTUluc3RhbGwyKSB2bUluc3RhbGw7Ci0gICAgICAgICAgICBpZiAodm1JbnN0YWxsMi5nZXRKYXZhVmVyc2lvbigpLmNvbXBhcmVUbyhKYXZhQ29yZS5WRVJTSU9OXzFfNikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGVudHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKS5jcmVhdGVDb21waWxhdGlvblVuaXQobmFtZSwgY29udGVudHMsIGZhbHNlLCBtb25pdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSwgdHJ1ZSwgbW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEphdmFQcm9qZWN0KCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMiKSk7ICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNvdXJjZUZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUZvbGRlciBzcmNEaXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMiKTsKLSAgICAgICAgbWtkaXJzKHNyY0Rpcik7ICAgIAotICAgICAgICBhZGRUb0NsYXNzcGF0aChqYXZhUHJvamVjdCwgSmF2YUNvcmUubmV3U291cmNlRW50cnkoc3JjRGlyLmdldEZ1bGxQYXRoKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlT3V0cHV0Rm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJRm9sZGVyIG91dHB1dERpciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImJpbiIpOwotICAgICAgICBta2RpcnMob3V0cHV0RGlyKTsKLSAgICAgICAgZ2V0SmF2YVByb2plY3QoKS5zZXRPdXRwdXRMb2NhdGlvbihvdXRwdXREaXIuZ2V0RnVsbFBhdGgoKSwgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIGphdmFQcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRUb0NsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gY3VycmVudENsYXNzcGF0aEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aEVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2N1cnJlbnRDbGFzc3BhdGhFbnRyaWVzLmxlbmd0aCArIDFdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjdXJyZW50Q2xhc3NwYXRoRW50cmllcywgMCwgbmV3Q2xhc3NwYXRoRW50cmllcywgMCwgCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdDbGFzc3BhdGhFbnRyaWVzW2N1cnJlbnRDbGFzc3BhdGhFbnRyaWVzLmxlbmd0aF0gPSBjbGFzc3BhdGhFbnRyeTsKLSAgICAgICAgICAgIGphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGhFbnRyaWVzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgam1lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1Rlc3RQcm9qZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1Rlc3RQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmM2IxNTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9UZXN0UHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLQotcHVibGljIGNsYXNzIFRlc3RQcm9qZWN0IHsKLSAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgcHJpdmF0ZSBJUHJvamVjdCB0ZXN0UHJvamVjdDsKLSAgICAKLSAgICBwdWJsaWMgVGVzdFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIHRlc3RQcm9qZWN0LmNyZWF0ZShtb25pdG9yKTsKLSAgICAgICAgdGVzdFByb2plY3Qub3Blbihtb25pdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiB0ZXN0UHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkUHJvamVjdE5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmF0dXJlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIHByb2plY3REZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHByZXZpb3VzTmF0dXJlcyA9IHByb2plY3REZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZpb3VzTmF0dXJlcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocHJldmlvdXNOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBwcmV2aW91c05hdHVyZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIG5ld05hdHVyZXNbcHJldmlvdXNOYXR1cmVzLmxlbmd0aF0gPSBuYXR1cmU7Ci0gICAgICAgICAgICBwcm9qZWN0RGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihwcm9qZWN0RGVzY3JpcHRpb24sIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBjZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBta2RpcnMoZmluYWwgSUZvbGRlciBmb2xkZXIpIHsKLSAgICAJdHJ5IHsKLQkgICAgICAgIGlmICghZm9sZGVyLmV4aXN0cygpICYmIGZvbGRlci5nZXRQYXJlbnQoKS5pc0FjY2Vzc2libGUoKSkgewotCSAgICAgICAgICAgIGZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JICAgICAgICB9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWNlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzBjYjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQzZmNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQwMDIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1RodSBNYXkgMDcgMTU6NDA6MjMgSVNUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM4M2FhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMC41LjEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1JbXBvcnQtUGFja2FnZTogamF2YXguandzLAotIGphdmF4Lmp3cy5zb2FwLAotIGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhMDMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQzYmM3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDk5NzExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlIGFuZCBvdGhlcnMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI3Byb3BlcnRpZXMgZmlsZSBmb3IgSkFYLVdTIFRvb2xzIFRlc3RzCi1wbHVnaW5OYW1lPUpBWC1XUyBUb29scyBUZXN0cyAoSW5jdWJhdGlvbikKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTVhZDAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy5BYnN0cmFjdEFubm90YXRpb25UZXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXV0b0J1aWxkaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0ZmY1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLSAgICAgICAgCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzdHlsZSIsIFN0eWxlLkRPQ1VNRU5UKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5MSVRFUkFMKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5CQVJFKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycyk7Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHQiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBTdHJpbmcgb25lSU4oU3RyaW5nIGluT25lLCBTdHJpbmcgaW5Ud28pIHtcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fSIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdE9uZXdheVZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZGUzMDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdE9uZXdheVZhbGlkYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9uZXdheVZhbGlkYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgT25ld2F5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IElNZXRob2QgZ2V0TWV0aG9kVG9UZXN0KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25ld2F5UnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoT25ld2F5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2RUb1Rlc3QoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBPbmV3YXkuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoT25ld2F5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldEVycm9yTWVzc2FnZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZTI3Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoU3RyaW5nIGluKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFhZThjMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15Q2xhc3NcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0U3RyaW5nIG15UGFja2FnZVByaXZhdGVNZXRob2QoKSB7XG5cdFx0cmV0dXJuIFwicGFja2FnZS1wcml2YXRlXCI7XG5cdH1cblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHByaXZhdGUgU3RyaW5nIG15UHJpdmF0ZU1ldGhvZCgpIHtcblx0XHRyZXR1cm4gXCJwcml2YXRlXCI7XG5cdH1cblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHByb3RlY3RlZCBTdHJpbmcgbXlQcm90ZWN0ZWRNZXRob2QoKSB7XG5cdFx0bXlQcml2YXRlTWV0aG9kKCk7XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0XHRyZXR1cm4gXCJwcm90ZWN0ZWRcIjtcblx0fVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBzdGF0aWMgU3RyaW5nIG15U3RhdGljTWV0aG9kKCkge1xuXHRcdHJldHVybiBcInN0YXRpY1wiO1xuXHR9XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgZmluYWwgU3RyaW5nIG15RmluYWxNZXRob2QoKSB7XG5cdFx0cmV0dXJuIFwiZmluYWxcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc2V0KCk7Ci0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJNZXRob2RSZXN0cmljdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2RUb1Rlc2V0KCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhnZXRFcnJvck1lc3NhZ2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWI2MTk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIk15Q2xhc3MiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcG9ydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAiTXlDbGFzc1BvcnQiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAic2VydmljZU5hbWUiLCAiTXlDbGFzc1NlcnZpY2UiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZXhhbXBsZS5jb20vIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBvcnROYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc2VydmljZU5hbWVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJhMGQ4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChnZXRQYWNrYWdlTmFtZSgpLCBnZXRJbnRlcmZhY2VOYW1lKCksIGdldEludGVyZmFjZUNvbnRlbnRzKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLmV4YW1wbGUuTXlJbnRlcmZhY2VcIiwgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJ0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vZXhhbXBsZS5jb20vXCIsIHBvcnROYW1lPVwiTXlDbGFzc1BvcnRcIiwgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJzZXJ2aWNlTmFtZT1cIk15Q2xhc3NTZXJ2aWNlXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyB2b2lkIG1ldGhvZE9uZShTdHJpbmcgaW4pIHtcblx0fVxuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIFN0cmluZyBteU1ldGhvZChTdHJpbmcgaW4pIHsiICsgIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW50ZXJmYWNlQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2VpQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIHNlaUNvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgc2VpQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiTXlJbnRlcmZhY2VcIiwgdGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL2V4YW1wbGUuY29tL1wiKVxuIik7Ci0gICAgICAgIHNlaUNvbnRlbnRzLmFwcGVuZCgicHVibGljIGludGVyZmFjZSBNeUludGVyZmFjZSB7XG5cbiIpOwotICAgICAgICBzZWlDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIFN0cmluZyBteU1ldGhvZChTdHJpbmcgaW4pO1xuXG59Iik7Ci0gICAgICAgIHJldHVybiBzZWlDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUludGVyZmFjZS5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU5vblZvaWROb091dFBhcmFtZXRlcnNSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlTm9uVm9pZE5vT3V0UGFyYW1ldGVyc1J1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjY0MjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlTm9uVm9pZE5vT3V0UGFyYW1ldGVyc1J1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIERvY0JhcmVOb25Wb2lkTm9PdXRQYXJhbWV0ZXJzUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIFN0cmluZyBub091dChTdHJpbmcgaW4sIEBXZWJQYXJhbShuYW1lPVwib3V0XCIsIG1vZGU9V2ViUGFyYW0uTW9kZS5PVVQpICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiU3RyaW5nIG91dCkge1xuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uVm9pZE5vT1VUUGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm5vT3V0IiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiwKLSAgICAgICAgICAgICAgICAgICAgIlFTdHJpbmc7ICJ9KTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX05PTl9WT0lEX1JFVFVSTl9OT19JTk9VVF9PVVRfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlT25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlT25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWI4NDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIERvY0JhcmVPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudEJhcmVWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdCIpOwotICAgICAgICAvL2NsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgU3RyaW5nIG9uZUlOKCkge1xuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG5cblx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgU3RyaW5nIG9uZU1vcmUoQFdlYlBhcmFtKG5hbWU9XCJpbk9uZVwiLCBtb2RlPVdlYlBhcmFtLk1vZGUuSU4pIFN0cmluZyAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImluT25lLCBAV2ViUGFyYW0obmFtZT1cImluVHdvXCIsIG1vZGU9V2ViUGFyYW0uTW9kZS5JTilTdHJpbmcgaW5Ud28pIHtcblx0XHQiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInJldHVybiBcInR4dFwiO1xuXHR9XG5cblx0cHVibGljIFN0cmluZyBvbmx5T25lSU4oU3RyaW5nIGluT25lLCBTdHJpbmcgaW5Ud28pIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiU09BUEJpbmRpbmciLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm9uZUlOIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5nZXRJbXBvcnRDaGFuZ2UoY29tcGlsYXRpb25Vbml0LCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UsIHRydWUpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlTWV0aG9kQW5ub3RhdGlvbkNoYW5nZShzb3VyY2UsIGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiwgdGV4dEZpbGVDaGFuZ2UpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9PTkVfTk9OX0hFQURFUl9JTl9QQVJBTUVURVJfRVJST1JfTUVTU0FHRSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0qLwotCi0gICAgcHVibGljIHZvaWQgdGVzdE9ubHlPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJvbmx5T25lSU4iLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiLAotICAgICAgICAgICAgICAgICAgICAiUVN0cmluZzsiIH0pOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfT05MWV9PTkVfTk9OX0hFQURFUl9JTl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25seU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyV2l0aFdlYlBhcmFtc1J1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJvbmVNb3JlIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiwKLSAgICAgICAgICAgICAgICAgICAgIlFTdHJpbmc7IiB9KTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVWb2lkT25lSU5PbmVPdXRQYXJhbWV0ZXJSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlVm9pZE9uZUlOT25lT3V0UGFyYW1ldGVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2NTEyMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVWb2lkT25lSU5PbmVPdXRQYXJhbWV0ZXJSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRG9jQmFyZVZvaWRPbmVJTk9uZU91dFBhcmFtZXRlclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudEJhcmVWYWxpZGF0aW9uVGVzdCB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgdm9pZCBvbmVJbihAV2ViUGFyYW0obmFtZT1cImluT25lXCIsIG1vZGU9V2ViUGFyYW0uTW9kZS5JTk9VVCkgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJIb2xkZXI8U3RyaW5nPiBpbk9uZSwgQFdlYlBhcmFtKG5hbWU9XCJpblR3b1wiLCBtb2RlPVdlYlBhcmFtLk1vZGUuSU4pICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiU3RyaW5nIGluVHdvKSB7XG5cblx0fVxuXG5cdCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIHZvaWQgb25lT3V0KEBXZWJQYXJhbShuYW1lPVwib3V0T25lXCIsIG1vZGU9V2ViUGFyYW0uTW9kZS5JTk9VVCkgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJIb2xkZXI8U3RyaW5nPiBvdXRPbmUsIEBXZWJQYXJhbShuYW1lPVwib3V0VHdvXCIsIG1vZGU9V2ViUGFyYW0uTW9kZS5PVVQpICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiSG9sZGVyPFN0cmluZz4gb3V0VHdvKSB7XG5cblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZvaWRPbmVJblBhcmFtZXRlclJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJvbmVJbiIsIG5ldyBTdHJpbmdbXSB7ICJRSG9sZGVyPFFTdHJpbmc7PjsiLAotICAgICAgICAgICAgICAgICAgICAiUVN0cmluZzsifSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfSU5fUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZvaWRPbmVPdXRQYXJhbWV0ZXJSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgib25lT3V0IiwgbmV3IFN0cmluZ1tdIHsgIlFIb2xkZXI8UVN0cmluZzs+OyIsCi0gICAgICAgICAgICAgICAgICAgICJRSG9sZGVyPFFTdHJpbmc7PjsifSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfT1VUX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Ib2xkZXJUeXBlUGFyYW1ldGVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSG9sZGVyVHlwZVBhcmFtZXRlclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmN2Q1MTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Ib2xkZXJUeXBlUGFyYW1ldGVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgSG9sZGVyVHlwZVBhcmFtZXRlclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIHZvaWQgbXlNZXRob2QoIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViUGFyYW0obW9kZT1XZWJQYXJhbS5Nb2RlLklOKSBIb2xkZXI8amF2YS5sYW5nLlN0cmluZz4gcGFyYW0pIHtcblxuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbGRlclR5cGVQYXJhbWV0ZXJSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuSE9MREVSX1RZUEVfTVVTVF9CRV9PVVRfSU5PVVQsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Y2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9KQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODRhMWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9KQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IEpBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZSgpIHsKLSAgICAgICAgc3VwZXIoIkpBWC1XUyBBbm5vdGF0aW9uIFZhbGlkYXRpb24gVGVzdHMiKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKERvY0JhcmVOb25Wb2lkTm9PdXRQYXJhbWV0ZXJzUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoRG9jQmFyZU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoRG9jQmFyZVZvaWRPbmVJTk9uZU91dFBhcmFtZXRlclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKE9uZXdheU5vUmV0dXJuVmFsdWVSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShPbmV3YXlOb0NoZWNrZWRFeGNlcHRpb25zUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoSG9sZGVyVHlwZVBhcmFtZXRlclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKE9uZXdheU5vSG9sZGVyUGFyYW1ldGVyc1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFNPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFNPQVBCaW5kaW5nUlBDRW5jb2RlZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFNPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoU09BUEJpbmRpbmdSQ1BCYXJlUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoU09BUEJpbmRpbmdNaXhlZEJpbmRpbmdzUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kRXhjbHVkZVJ1bGVPblNFSVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kRXhjbHVkZVJ1bGVPbkltcGxUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZE5vUGFja2FnZVByaXZhdGVNZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb1ByaXZhdGVNZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb1Byb3RlY3RlZE1ldGhvZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZE5vRmluYWxNb2RpZmllclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZE5vU3RhdGljTW9kaWZpZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJQYXJhbU1vZGVIb2xkZXJUeXBlUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZU5vRmluYWxNb2RpZmVyUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZU5vQWJzdHJhY3RNb2RpZmllclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb1NlcnZpY2VOYW1lUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVNFSU5vRW5kcG9pbnRJbnRlcmZhY2VSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb1dlYk1ldGhvZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb1dlYlJlc3VsdFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb1dlYlBhcmFtUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVNFSU5vT25ld2F5UnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVNFSU5vU09BUEJpbmRpbmdSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGVUZXN0LmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9DaGVja2VkRXhjZXB0aW9uc1J1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vQ2hlY2tlZEV4Y2VwdGlvbnNSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlkMDlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9DaGVja2VkRXhjZXB0aW9uc1J1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE9uZXdheU5vQ2hlY2tlZEV4Y2VwdGlvbnNSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0T25ld2F5VmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIHZvaWQgbXlNZXRob2QoaW50IGkpIHRocm93cyBFeGNlcHRpb24ge1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fQ0hFQ0tFRF9FWENFUFRJT05TOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzdCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdeyJJIn0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb0hvbGRlclBhcmFtZXRlcnNSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb0hvbGRlclBhcmFtZXRlcnNSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWY0YThhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9Ib2xkZXJQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgT25ld2F5Tm9Ib2xkZXJQYXJhbWV0ZXJzUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdE9uZXdheVZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyB2b2lkIG15TWV0aG9kKCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiSG9sZGVyPFN0cmluZz4gaW4pIHtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuT05FV0FZX05PX0hPTERFUl9QQVJBTUVURVJTOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzdCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdeyJRSG9sZGVyPFFTdHJpbmc7PjsifSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vUmV0dXJuVmFsdWVSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhMGY5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vUmV0dXJuVmFsdWVSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBPbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdE9uZXdheVZhbGlkYXRpb25UZXN0IHsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLQkgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotCSAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBpbnQgbXlNZXRob2QoaW50IGkpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotCX0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuT05FV0FZX05PX1JFVFVSTl9WQUxVRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc3QoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXXsiSSJ9KTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdEb2N1bWVudEVuY29kZWRSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY4NDIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdEb2N1bWVudEVuY29kZWRSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic3R5bGUiLCBTdHlsZS5ET0NVTUVOVCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHVzZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJ1c2UiLCBVc2UuRU5DT0RFRCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInBhcmFtZXRlclN0eWxlIiwgUGFyYW1ldGVyU3R5bGUuQkFSRSk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc3R5bGVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh1c2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdEb2N1bWVudEVuY29kZWRSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX0RPQ1VNRU5UX0VOQ09ERURfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdNaXhlZEJpbmRpbmdzUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdNaXhlZEJpbmRpbmdzUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5MDBjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuRE9DVU1FTlQpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAidXNlIiwgVXNlLkxJVEVSQUwpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJwYXJhbWV0ZXJTdHlsZSIsIFBhcmFtZXRlclN0eWxlLldSQVBQRUQpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFNPQVBCaW5kaW5nKHN0eWxlPVNPQVBCaW5kaW5nLlN0eWxlLlJQQywgdXNlPVNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLCAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInBhcmFtZXRlclN0eWxlPVNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKFN0cmluZyBpbikgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQQmluZGluZ01peGVkQmluZGluZ3NSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX01JWEVEX0JJTkRJTkdTLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JDUEJhcmVSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JDUEJhcmVSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODYyNjk0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSQ1BCYXJlUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdSQ1BCYXJlUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic3R5bGUiLCBTdHlsZS5SUEMpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAidXNlIiwgVXNlLkxJVEVSQUwpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJwYXJhbWV0ZXJTdHlsZSIsIFBhcmFtZXRlclN0eWxlLkJBUkUpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nUlBDQmFyZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19SUENfTk9fQkFSRV9QQVJBTUVURVJfU1RZTEUsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSUENFbmNvZGVkUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSUENFbmNvZGVkUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiMGEyNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDRW5jb2RlZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nUlBDRW5jb2RlZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuUlBDKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5FTkNPREVEKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQQmluZGluZ1JQQ0VuY29kZWRSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfUlBDX0VOQ09ERURfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JQQ1N0eWxlT25NZXRob2RSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JQQ1N0eWxlT25NZXRob2RSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTQyNGEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSUENTdHlsZU9uTWV0aG9kUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ1JQQ1N0eWxlT25NZXRob2RSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzdHlsZSIsIFN0eWxlLlJQQyk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHVzZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJ1c2UiLCBVc2UuTElURVJBTCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInBhcmFtZXRlclN0eWxlIiwgUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc3R5bGVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh1c2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdSUENTdHlsZU9uTWV0aG9kc1J1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfTk9fUlBDX1NUWUxFX09OX01FVEhPRFMsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0MGM0ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBvcGVyYXRpb25WYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAib3BlcmF0aW9uTmFtZSIsICJteU1ldGhvZCIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBhY3Rpb25WYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgImFjdGlvbiIsCi0gICAgICAgICAgICAgICAgInVybjpNeU1ldGhvZCIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG9wZXJhdGlvblZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGFjdGlvblZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZCgpIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RFeGNsdWRlUnVsZU9uSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kRXhjbHVkZVJ1bGVPbkltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZTg4YmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RFeGNsdWRlUnVsZU9uSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RFeGNsdWRlUnVsZU9uSW1wbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBvcGVyYXRpb25WYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAib3BlcmF0aW9uTmFtZSIsICJteU1ldGhvZCIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBhY3Rpb25WYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgImFjdGlvbiIsCi0gICAgICAgICAgICAgICAgInVybjpNeU1ldGhvZCIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBleGNsdWRlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUJvb2xlYW5NZW1iZXJWYWx1ZVBhaXIoYXN0LCAiZXhjbHVkZSIsCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChvcGVyYXRpb25WYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChhY3Rpb25WYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChleGNsdWRlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiTXlDbGFzc1wiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZCgpIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX05PX09USEVSX0FUVFJJQlVURVNfQUxMT1dFRCwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kRXhjbHVkZVJ1bGVPblNFSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kRXhjbHVkZVJ1bGVPblNFSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4MDI0OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kRXhjbHVkZVJ1bGVPblNFSVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBleGNsdWRlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUJvb2xlYW5NZW1iZXJWYWx1ZVBhaXIoYXN0LCAiZXhjbHVkZSIsCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChleGNsdWRlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiTXlJbnRlcmZhY2VcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGludGVyZmFjZSBNeUNsYXNzIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKCk7XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViTWV0aG9kRXhjbHVkZVJ1bGVPbkludGVyZmFjZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX0VYQ0xVREVfTk9UX0FMTE9XRURfT05fU0VJLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vRmluYWxNb2RpZmllclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vRmluYWxNb2RpZmllclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNGQ1NmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb0ZpbmFsTW9kaWZpZXJSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2ROb0ZpbmFsTW9kaWZpZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc2V0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlGaW5hbE1ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX0ZJTkFMX01PRElGSUVSX0FMTE9XRUQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUGFja2FnZVByaXZhdGVNZXRob2RSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1BhY2thZ2VQcml2YXRlTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlOGViMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUGFja2FnZVByaXZhdGVNZXRob2RSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2ROb1BhY2thZ2VQcml2YXRlTWV0aG9kUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXNldCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15UGFja2FnZVByaXZhdGVNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1ByaXZhdGVNZXRob2RSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1ByaXZhdGVNZXRob2RSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODI0MWMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9Qcml2YXRlTWV0aG9kUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kTm9Qcml2YXRlTWV0aG9kUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXNldCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15UHJpdmF0ZU1ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJvdGVjdGVkTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9Qcm90ZWN0ZWRNZXRob2RSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTU4MzU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9Qcm90ZWN0ZWRNZXRob2RSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2ROb1Byb3RlY3RlZE1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteVByb3RlY3RlZE1ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vU3RhdGljTW9kaWZpZXJSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1N0YXRpY01vZGlmaWVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhZTUzZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vU3RhdGljTW9kaWZpZXJSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2ROb1N0YXRpY01vZGlmaWVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXNldCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15U3RhdGljTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fU1RBVElDX01PRElGSUVSX0FMTE9XRUQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlBhcmFtTW9kZUhvbGRlclR5cGVSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJQYXJhbU1vZGVIb2xkZXJUeXBlUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyM2YwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlBhcmFtTW9kZUhvbGRlclR5cGVSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbW9kZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJtb2RlIiwgTW9kZS5PVVQpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG1vZGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiTXlDbGFzc1wiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZChTdHJpbmcgcGFyYW0pIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlBhcmFtTW9kZUhvbGRlclR5cGVSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCAicGFyYW0iKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobG9jYWxWYXJpYWJsZSwgV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJQQVJBTV9NT0RFX09VVF9JTk9VVF9IT0xERVJfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH1jYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYThmZGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiTXlDbGFzcyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwb3J0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAicG9ydE5hbWUiLAotICAgICAgICAgICAgICAgICJNeUNsYXNzUG9ydCIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzZXJ2aWNlTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJzZXJ2aWNlTmFtZSIsICJNeUNsYXNzU2VydmljZSIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBNeUNsYXNzKFN0cmluZyBhcmcpIHtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0Fic3RyYWN0TW9kaWZpZXJSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9BYnN0cmFjdE1vZGlmaWVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwODMyNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0Fic3RyYWN0TW9kaWZpZXJSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOb0Fic3RyYWN0TW9kaWZpZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNeUNsYXNzIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKSB7IiArICJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsTW9kaWZlclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsTW9kaWZlclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzkxZjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9GaW5hbE1vZGlmZXJSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOb0ZpbmFsTW9kaWZlclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGZpbmFsIGNsYXNzIE15Q2xhc3Mge1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIFN0cmluZyBteU1ldGhvZCgpIHsiICsgIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODRjNDMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiTXlDbGFzcyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwb3J0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAicG9ydE5hbWUiLAotICAgICAgICAgICAgICAgICJNeUNsYXNzUG9ydCIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzZXJ2aWNlTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJzZXJ2aWNlTmFtZSIsICJNeUNsYXNzU2VydmljZSIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyB2b2lkIGZpbmFsaXplKCkge1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9PVkVSUklERV9GSU5BTElaRSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb0VuZHBvaW50SW50ZXJmYWNlUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwZGUxZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb0VuZHBvaW50SW50ZXJmYWNlUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb0VuZHBvaW50SW50ZXJmYWNlUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIk15Q2xhc3MiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZW5kcG9pbnRJbnRlcmZhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAiZW5kcG9pbnRJbnRlcmZhY2UiLCAiTXlJbnRlcmZhY2UiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZXhhbXBsZS5jb20vIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGVuZHBvaW50SW50ZXJmYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15ZU1ldGhvZCgpO1xuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlJbnRlcmZhY2UuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlOb0VuZHBvaW50SW50ZXJmYWNlUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5EUE9JTlRJTlRFUkZBQ0VfU0VJLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb09uZXdheVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb09uZXdheVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYzdmMzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9PbmV3YXlSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vT25ld2F5UnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIE9uZXdheS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJUHJlc2VudE5vT25ld2F5UnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoT25ld2F5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJtZXRob2RPbmUiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIE9uZXdheS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChPbmV3YXkuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX09ORVdBWSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1BvcnROYW1lUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY5ZjA0NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1BvcnROYW1lUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb1BvcnROYW1lUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIk15Q2xhc3MiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZXhhbXBsZS5jb20vIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBvcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJwb3J0TmFtZSIsCi0gICAgICAgICJNeUNsYXNzUG9ydCIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwb3J0TmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGludGVyZmFjZSBNeUludGVyZmFjZSB7XG5cblx0cHVibGljIFN0cmluZyBteWVNZXRob2QoKTtcblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15SW50ZXJmYWNlLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BPUlROQU1FX1NFSSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9TT0FQQmluZGluZ1J1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1NPQVBCaW5kaW5nUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkMWI5OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1NPQVBCaW5kaW5nUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9TT0FQQmluZGluZ1J1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NPQVBCaW5kaW5nT25NZXRob2RSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19TT0FQQklORElORywKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NPQVBCaW5kaW5nT25UeXBlUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19TT0FQQklORElORywKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1NlcnZpY2VOYW1lUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMzVmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1NlcnZpY2VOYW1lUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb1NlcnZpY2VOYW1lUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIk15Q2xhc3MiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZXhhbXBsZS5jb20vIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHNlcnZpY2VOYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInNlcnZpY2VOYW1lIiwgIk15Q2xhc3NTZXJ2aWNlIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHNlcnZpY2VOYW1lVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgaW50ZXJmYWNlIE15SW50ZXJmYWNlIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15ZU1ldGhvZCgpO1xuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlJbnRlcmZhY2UuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlOb1NlcnZpY2VOYW1lUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfU0VSVklDRU5BTUVfU0VJLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYk1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYk1ldGhvZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDkyMDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJNZXRob2RSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vV2ViTWV0aG9kUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJUHJlc2VudE5vV2ViTWV0aG9kUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCTUVUSE9EUywKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYlBhcmFtUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiOTRjOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYlBhcmFtUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vV2ViUGFyYW1SdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSVByZXNlbnROb1dlYlBhcmFtUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm1ldGhvZE9uZSIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TG9jYWxWYXJpYWJsZShtZXRob2QsICJpbiIpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobG9jYWxWYXJpYWJsZSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViUmVzdWx0UnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViUmVzdWx0UnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwZjI4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYlJlc3VsdFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9XZWJSZXN1bHRSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViUmVzdWx0LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlQcmVzZW50Tm9XZWJSZXN1bHRSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJSZXN1bHQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBXZWJSZXN1bHQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViUmVzdWx0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJSRVNVTFQsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTBkMzQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlUHJvdmlkZXJcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3MgaW1wbGVtZW50cyBQcm92aWRlcjxTb3VyY2U+IHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTb3VyY2UgaW52b2tlKFNvdXJjZSBhcmcwKSB7IiArICJcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1dFQlNFUlZJQ0VQUk9WSURFUl9DT01CSU5BVElPTiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZmIzNzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TaGFyZWRBU1RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUGVyZm9ybUNoYW5nZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgdGVzdEphdmFQcm9qZWN0OwotICAgIHByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZTsKLSAgICBwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdDsKLSAgICBwcm90ZWN0ZWQgQVNUIGFzdDsKLSAgICBwcm90ZWN0ZWQgQVNUUmV3cml0ZSByZXdyaXRlcjsKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotICAgIHByb3RlY3RlZCBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZTsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0SmF2YVByb2plY3QgPSBuZXcgVGVzdEphdmFQcm9qZWN0KCJKYXZhUHJvamVjdCIpOwotICAgICAgICB0ZXN0SmF2YVByb2plY3Quc2V0QXV0b0J1aWxkaW5nKGlzQXV0b0J1aWxkaW5nRW5hYmxlZCgpKTsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0LmVuYWJsZUFubm90YXRpb25Qcm9jZXNzaW5nKGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkpOwotCi0gICAgICAgIHNvdXJjZSA9IHRlc3RKYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoZ2V0UGFja2FnZU5hbWUoKSwgZ2V0Q2xhc3NOYW1lKCksIGdldENsYXNzQ29udGVudHMoKSk7Ci0KLSAgICAgICAgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotICAgICAgICBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0gICAgICAgIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLSAgICAgICAgYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFkZCBhbm5vdGF0aW9uIiwgKElGaWxlKSBzb3VyY2UuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXV0b0J1aWxkaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpOwotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhbmdlLmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShtb25pdG9yKTsKLQotICAgICAgICBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uIGNoYW5nZU9wZXJhdGlvbiA9IG5ldyBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uKGNoYW5nZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYW5nZU9wZXJhdGlvbi5ydW4obW9uaXRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGNlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFuZ2VPcGVyYXRpb24uY2hhbmdlRXhlY3V0ZWQoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJZGVsZXRlUHJvamVjdCh0ZXN0SmF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVsZXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgIAlpbnQgbm9BdHRlbXB0cyA9IDA7Ci0gICAgCXdoaWxlIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiBub0F0dGVtcHRzIDwgNSkgewotICAgIAkJdHJ5IHsKLSAgICAJCQlub0F0dGVtcHRzKys7Ci0gICAgCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLSAgICAJCQkJcHJvamVjdC5jbG9zZShudWxsKTsgICAgCQkJCQotICAgIAkJCX0KLSAgICAJCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLSAgICAJCX0gY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIHJlKSB7Ci0gICAgCQkJU3lzdGVtLm91dC5wcmludGxuKHJlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgCQkJVGhyZWFkLnNsZWVwKDEpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub0ZpZWxkVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub0ZpZWxkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWM2OTJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9GaWVsZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9GaWVsZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICByZXR1cm4gInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbnB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRzdGF0aWMgU3RyaW5nIHNlcnZpY2U7XG5cbn0iOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHdzZGxMb2NhdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ3c2RsTG9jYXRpb24iLCAiaHR0cDovL2xvY2FsaG9zdDo4MDgzL1NlcnZpY2VQcm9qZWN0L3NlcnZpdmVzL015U2VydmljZT9XU0RMIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQod3NkbExvY2F0aW9uVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb25Ub0ZpZWxkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZpZWxkKCJzZXJ2aWNlIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZpZWxkKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoZmllbGQsIFdlYlNlcnZpY2VSZWYuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoZmllbGQsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoZmllbGQsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2VSZWYuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub01ldGhvZFBhcmFtZXRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjI5NWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub01ldGhvZFBhcmFtZXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIEFkZEFubm90YXRpb25Ub01ldGhvZFBhcmFtZXRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG5cblx0cHVibGljIGludCBhZGQoaW50IGksIGludCBrKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gaSArIGs7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgImkiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJhZGQiLCBuZXcgU3RyaW5nW10geyAiSSIsICJJIiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgbG9jYWxWYXJpYWJsZSAgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TG9jYWxWYXJpYWJsZShtZXRob2QsICJpIik7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KGxvY2FsVmFyaWFibGUsIFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobG9jYWxWYXJpYWJsZSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvTWV0aG9kVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub01ldGhvZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmZTYxZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvTWV0aG9kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIEFkZEFubm90YXRpb25Ub01ldGhvZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG5cblx0cHVibGljIGludCBhZGQoaW50IGksIGludCBrKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gaSArIGs7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBvcGVyYXRpb25WYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAib3BlcmF0aW9uTmFtZSIsICJhZGQiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChvcGVyYXRpb25WYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uVG9NZXRob2QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1R5cGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvVHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0ZmFkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvVHlwZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLQotcHVibGljIGNsYXNzIEFkZEFubm90YXRpb25Ub1R5cGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG5cdHB1YmxpYyBpbnQgYWRkKGludCBpLCBpbnQgaykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZQotICAgICAgICAgICAgICAgIC5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJDYWxjdWxhdG9yIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCBKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoZ2V0UGFja2FnZU5hbWUoKSkpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwb3J0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAicG9ydE5hbWUiLAotICAgICAgICAgICAgICAgICJDYWxjdWxhdG9yUG9ydCIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzZXJ2aWNlTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJzZXJ2aWNlTmFtZSIsICJDYWxjdWxhdG9yU2VydmljZSIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwb3J0TmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHNlcnZpY2VOYW1lVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb25Ub1R5cGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZE1lbWJlclZhbHVlUGFpclRvQW5ub3RhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRNZW1iZXJWYWx1ZVBhaXJUb0Fubm90YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZmY1MTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZE1lbWJlclZhbHVlUGFpclRvQW5ub3RhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGRNZW1iZXJWYWx1ZVBhaXJUb0Fubm90YXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgew0KLQkgICAgcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsNCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYk1ldGhvZDtcbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7XG5cbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKClcbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRAV2ViU2VydmljZVJlZigpXG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlGaWVsZDtcblxuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRAV2ViTWV0aG9kKClcbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIGludCBhZGQoQFdlYlBhcmFtKCkgaW50IGksIGludCBrKSB7Iik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7DQotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsNCi0JCXJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsNCi0JCXJldHVybiAiY29tLmV4YW1wbGUiOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvL0BXZWJTZXJ2aWNlDQotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgIldlYlNlcnZpY2UiKSk7DQotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgV2ViU2VydmljZS5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2UgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYlNlcnZpY2U7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMCk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJDYWxjdWxhdG9yIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZE1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlQW5ub3RhdGlvbiwgbmFtZVZhbHVlUGFpcik7DQotICAgICAgICAgICAgd2ViU2VydmljZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgV2ViU2VydmljZS5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7DQotDQotICAgICAgICAgICAgLy9AV2ViU2VydmljZVJlZg0KLSAgICAgICAgICAgIElGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIm15RmllbGQiKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGZpZWxkLCAiV2ViU2VydmljZVJlZiIpKTsNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYlNlcnZpY2VSZWYgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihmaWVsZCwgV2ViU2VydmljZVJlZi5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlUmVmKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VSZWYgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYlNlcnZpY2VSZWY7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMCk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWFwcGVkTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibWFwcGVkTmFtZSIsICJteUZpZWxkIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZE1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbiwgbWFwcGVkTmFtZVZhbHVlUGFpcik7DQotICAgICAgICAgICAgd2ViU2VydmljZVJlZkFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZmllbGQsIFdlYlNlcnZpY2VSZWYuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZVJlZkFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOw0KLQ0KLSAgICAgICAgICAgIC8vQFdlYk1ldGhvZA0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImFkZCIsIG5ldyBTdHJpbmdbXSB7ICJJIiwgIkkiIH0pOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCAiV2ViTWV0aG9kIikpOw0KLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViTWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViTWV0aG9kKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYk1ldGhvZCBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViTWV0aG9kQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJNZXRob2Q7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJNZXRob2RBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAwKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBvcGVyYXRpb25OYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJvcGVyYXRpb25OYW1lIiwgImFkZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRNZW1iZXJWYWx1ZVBhaXIod2ViTWV0aG9kQW5ub3RhdGlvbiwgb3BlcmF0aW9uTmFtZVZhbHVlUGFpcik7DQotICAgICAgICAgICAgd2ViTWV0aG9kQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2QsIFdlYk1ldGhvZC5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJNZXRob2RBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsNCi0NCi0gICAgICAgICAgICAvL0BXZWJQYXJhbQ0KLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TG9jYWxWYXJpYWJsZShtZXRob2QsICJpIik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChsb2NhbFZhcmlhYmxlLCAiV2ViUGFyYW0iKSk7DQotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGxvY2FsVmFyaWFibGUsIFdlYlBhcmFtLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlBhcmFtKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlBhcmFtIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJQYXJhbUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViUGFyYW07DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJQYXJhbUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDApOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJwYXJ0TmFtZSIsICJpIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZE1lbWJlclZhbHVlUGFpcih3ZWJQYXJhbUFubm90YXRpb24sIHBhcnROYW1lVmFsdWVQYWlyKTsNCi0gICAgICAgICAgICB3ZWJQYXJhbUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obG9jYWxWYXJpYWJsZSwgV2ViUGFyYW0uY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViUGFyYW1Bbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsNCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsNCi0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7DQotICAgICAgICB9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0pBWFdTQ29yZVRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0pBWFdTQ29yZVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmViZjE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9KQVhXU0NvcmVUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU0NvcmVUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IEpBWFdTQ29yZVRlc3RTdWl0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBKQVhXU0NvcmVUZXN0U3VpdGUoKSB7Ci0gICAgICAgIHN1cGVyKCJKQVgtV1MgQ29yZSBUZXN0cyIpOwotICAgICAgICBhZGRUZXN0U3VpdGUoQWRkQW5ub3RhdGlvblRvVHlwZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShBZGRBbm5vdGF0aW9uVG9GaWVsZFRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZFRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoQWRkQW5ub3RhdGlvblRvTWV0aG9kVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShSZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoQWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShSZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFBhcmFtZXRlclRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoQWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShSZW1vdmVNZW1iZXJWYWx1ZVBhaXJUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFVwZGF0ZU1lbWJlclZhbHVlUGFpclRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRlc3QuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tRmllbGRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiZmRmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0QFdlYlNlcnZpY2VSZWYoKVxuXHRzdGF0aWMgU3RyaW5nIHNlcnZpY2U7XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25Gcm9tRmllbGQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2VSZWYuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJRmllbGQgZmllbGQgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RmllbGQoInNlcnZpY2UiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZmllbGQpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGZpZWxkLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoZmllbGQsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0KGZpZWxkLCBXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoZmllbGQsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzBiMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG5cblx0cHVibGljIGludCBhZGQoQFdlYlBhcmFtKG5hbWU9XCJpXCIpIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbnQgaSwgaW50IGspIHtcblx0XHRyZXR1cm4gaSArIGs7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFBhcmFtZXRlcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoImFkZCIsIG5ldyBTdHJpbmdbXSB7ICJJIiwgIkkiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCAiaSIpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc291cmNlLmdldEltcG9ydChXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0KGxvY2FsVmFyaWFibGUsIFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobG9jYWxWYXJpYWJsZSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc291cmNlLmdldEltcG9ydChXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyYTFhNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG5cdEBXZWJNZXRob2Rcblx0cHVibGljIGludCBhZGQoaW50IGksIGludCBrKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gaSArIGs7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChtZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTMzN2Q2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJNeUNsYXNzXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiTXlJbnRlcmZhY2VcIiwgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJ0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vZXhhbXBsZS5jb20vXCIsIHBvcnROYW1lPVwiTXlDbGFzc1BvcnRcIiwgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJzZXJ2aWNlTmFtZT1cIk15Q2xhc3NTZXJ2aWNlXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKSB7IiArICJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uRnJvbVR5cGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZU1lbWJlclZhbHVlUGFpclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVNZW1iZXJWYWx1ZVBhaXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MDMyZjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZU1lbWJlclZhbHVlUGFpclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIkNhbGN1bGF0b3JcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU1lbWJlclZhbHVlUGFpckZyb21Bbm5vdGF0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCAiV2ViU2VydmljZSIpKTsKLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViU2VydmljZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZSBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOwotCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYlNlcnZpY2U7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYlNlcnZpY2VBbm5vdGF0aW9uLCAibmFtZSIpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMucmVtb3ZlTWVtYmVyVmFsdWVQYWlyKHdlYlNlcnZpY2VBbm5vdGF0aW9uLCBuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTBiNWI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLnV0aWwuQXB0Q29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SmF2YVByb2plY3QgZXh0ZW5kcyBUZXN0UHJvamVjdCB7Ci0gICAgcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0gICAgCi0gICAgcHVibGljIFRlc3RKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIocHJvamVjdE5hbWUpOwotICAgICAgICBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KCkpOwotICAgICAgICBhZGRQcm9qZWN0TmF0dXJlKGdldFByb2plY3QoKSwgSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQotICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3IElDbGFzc3BhdGhFbnRyeVswXSwgbnVsbCk7Ci0KLSAgICAgICAgY3JlYXRlU291cmNlRm9sZGVyKCk7Ci0gICAgICAgIGFkZFRvQ2xhc3NwYXRoKGphdmFQcm9qZWN0LCBnZXRKUkVDb250YWluZXJFbnRyeSgpKTsKLSAgICAgICAgY3JlYXRlT3V0cHV0Rm9sZGVyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9CdWlsZGluZyhib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgZGVzY3JpcHRpb24uc2V0QXV0b0J1aWxkaW5nKGF1dG9CdWlsZCk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUFubm90YXRpb25Qcm9jZXNzaW5nKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIEFwdENvbmZpZy5zZXRFbmFibGVkKGphdmFQcm9qZWN0LCBlbmFibGUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElDbGFzc3BhdGhFbnRyeSBnZXRKUkVDb250YWluZXJFbnRyeSgpIHsKLSAgICAgICAgSVZNSW5zdGFsbCBkZWZhdWx0Vk1JbnN0YWxsID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotICAgICAgICBpZiAoZGVmYXVsdFZNSW5zdGFsbCAhPSBudWxsICYmIGlzSmF2YTZPckdyZWF0ZXJKUkUoZGVmYXVsdFZNSW5zdGFsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBKYXZhUnVudGltZS5nZXREZWZhdWx0SlJFQ29udGFpbmVyRW50cnkoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSVZNSW5zdGFsbFR5cGVbXSBpbnN0YWxsVHlwZXMgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlcygpOwotICAgICAgICBmb3IgKElWTUluc3RhbGxUeXBlIGluc3RhbGxUeXBlIDogaW5zdGFsbFR5cGVzKSB7Ci0gICAgICAgICAgICBJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IGluc3RhbGxUeXBlLmdldFZNSW5zdGFsbHMoKTsKLSAgICAgICAgICAgIGZvciAoSVZNSW5zdGFsbCB2bUluc3RhbGwgOiB2bUluc3RhbGxzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzSmF2YTZPckdyZWF0ZXJKUkUodm1JbnN0YWxsKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoSmF2YVJ1bnRpbWUubmV3SlJFQ29udGFpbmVyUGF0aChpbnN0YWxsVHlwZS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtSW5zdGFsbC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBKYXZhUnVudGltZS5nZXREZWZhdWx0SlJFQ29udGFpbmVyRW50cnkoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSmF2YTZPckdyZWF0ZXJKUkUoSVZNSW5zdGFsbCB2bUluc3RhbGwpIHsKLSAgICAgICAgaWYgKHZtSW5zdGFsbCBpbnN0YW5jZW9mIElWTUluc3RhbGwyKSB7Ci0gICAgICAgICAgICBJVk1JbnN0YWxsMiB2bUluc3RhbGwyID0gKElWTUluc3RhbGwyKSB2bUluc3RhbGw7Ci0gICAgICAgICAgICBpZiAodm1JbnN0YWxsMi5nZXRKYXZhVmVyc2lvbigpLmNvbXBhcmVUbyhKYXZhQ29yZS5WRVJTSU9OXzFfNikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGVudHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKS5jcmVhdGVDb21waWxhdGlvblVuaXQobmFtZSwgY29udGVudHMsIGZhbHNlLCBtb25pdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSwgdHJ1ZSwgbW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEphdmFQcm9qZWN0KCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMiKSk7ICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNvdXJjZUZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUZvbGRlciBzcmNEaXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMiKTsKLSAgICAgICAgbWtkaXJzKHNyY0Rpcik7ICAgIAotICAgICAgICBhZGRUb0NsYXNzcGF0aChqYXZhUHJvamVjdCwgSmF2YUNvcmUubmV3U291cmNlRW50cnkoc3JjRGlyLmdldEZ1bGxQYXRoKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlT3V0cHV0Rm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJRm9sZGVyIG91dHB1dERpciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImJpbiIpOwotICAgICAgICBta2RpcnMob3V0cHV0RGlyKTsKLSAgICAgICAgZ2V0SmF2YVByb2plY3QoKS5zZXRPdXRwdXRMb2NhdGlvbihvdXRwdXREaXIuZ2V0RnVsbFBhdGgoKSwgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIGphdmFQcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRUb0NsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gY3VycmVudENsYXNzcGF0aEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aEVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2N1cnJlbnRDbGFzc3BhdGhFbnRyaWVzLmxlbmd0aCArIDFdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjdXJyZW50Q2xhc3NwYXRoRW50cmllcywgMCwgbmV3Q2xhc3NwYXRoRW50cmllcywgMCwgCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdDbGFzc3BhdGhFbnRyaWVzW2N1cnJlbnRDbGFzc3BhdGhFbnRyaWVzLmxlbmd0aF0gPSBjbGFzc3BhdGhFbnRyeTsKLSAgICAgICAgICAgIGphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGhFbnRyaWVzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgam1lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9UZXN0UHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2RlYWU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9UZXN0UHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLQotcHVibGljIGNsYXNzIFRlc3RQcm9qZWN0IHsKLSAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgcHJpdmF0ZSBJUHJvamVjdCB0ZXN0UHJvamVjdDsKLSAgICAKLSAgICBwdWJsaWMgVGVzdFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICB0ZXN0UHJvamVjdCA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIHRlc3RQcm9qZWN0LmNyZWF0ZShtb25pdG9yKTsKLSAgICAgICAgdGVzdFByb2plY3Qub3Blbihtb25pdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiB0ZXN0UHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkUHJvamVjdE5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmF0dXJlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIHByb2plY3REZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHByZXZpb3VzTmF0dXJlcyA9IHByb2plY3REZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZpb3VzTmF0dXJlcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocHJldmlvdXNOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBwcmV2aW91c05hdHVyZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIG5ld05hdHVyZXNbcHJldmlvdXNOYXR1cmVzLmxlbmd0aF0gPSBuYXR1cmU7Ci0gICAgICAgICAgICBwcm9qZWN0RGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihwcm9qZWN0RGVzY3JpcHRpb24sIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBjZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBta2RpcnMoZmluYWwgSUZvbGRlciBmb2xkZXIpIHsKLSAgICAJdHJ5IHsKLQkgICAgICAgIGlmICghZm9sZGVyLmV4aXN0cygpICYmIGZvbGRlci5nZXRQYXJlbnQoKS5pc0FjY2Vzc2libGUoKSkgewotCSAgICAgICAgICAgIGZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JICAgICAgICB9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWNlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1VwZGF0ZU1lbWJlclZhbHVlUGFpclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9VcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZGFmMWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1VwZGF0ZU1lbWJlclZhbHVlUGFpclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFVwZGF0ZU1lbWJlclZhbHVlUGFpclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYk1ldGhvZDtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJDYWxjdWxhdG9yXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdEBXZWJTZXJ2aWNlUmVmKG1hcHBlZE5hbWU9XCJteUZpZWxkXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIFN0cmluZyBteUZpZWxkO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0QFdlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwiYWRkXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIGludCBhZGQoQFdlYlBhcmFtKHBhcnROYW1lPVwiaVwiKSBpbnQgaSwgaW50IGspIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1lbWJlclZhbHVlUGFpcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vQFdlYlNlcnZpY2UKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgIldlYlNlcnZpY2UiKSk7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYlNlcnZpY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2UgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsKLQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJTZXJ2aWNlOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlQW5ub3RhdGlvbiwgIm5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICBTdHJpbmdMaXRlcmFsIG5hbWVWYWx1ZSA9ICAoU3RyaW5nTGl0ZXJhbCkgbmFtZVZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuYW1lVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJDYWxjdWxhdG9yIikpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMudXBkYXRlTWVtYmVyVmFsdWVQYWlyKG5hbWVWYWx1ZVBhaXIsIEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgIlNjaWVudGlmaWNDYWxjdWxhdG9yIikpOwotICAgICAgICAgICAgd2ViU2VydmljZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlQW5ub3RhdGlvbiwgIm5hbWUiKTsKLSAgICAgICAgICAgIG5hbWVWYWx1ZSA9ICAoU3RyaW5nTGl0ZXJhbCkgbmFtZVZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuYW1lVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJTY2llbnRpZmljQ2FsY3VsYXRvciIpKTsKLQotICAgICAgICAgICAgLy9AV2ViU2VydmljZVJlZgotICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCgibXlGaWVsZCIpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZCwgIldlYlNlcnZpY2VSZWYiKSk7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYlNlcnZpY2VSZWYgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihmaWVsZCwgV2ViU2VydmljZVJlZi5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2VSZWYpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlUmVmIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViU2VydmljZVJlZkFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViU2VydmljZVJlZjsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZVJlZkFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWFwcGVkTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZVJlZkFubm90YXRpb24sICJtYXBwZWROYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1hcHBlZE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBtYXBwZWROYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIG1hcHBlZE5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWFwcGVkTmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygibXlGaWVsZCIpKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnVwZGF0ZU1lbWJlclZhbHVlUGFpcihtYXBwZWROYW1lVmFsdWVQYWlyLCBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsICJhbm90aGVyRmllbGQiKSk7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihmaWVsZCwgV2ViU2VydmljZVJlZi5jbGFzcyk7Ci0gICAgICAgICAgICBtYXBwZWROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbiwgIm1hcHBlZE5hbWUiKTsKLSAgICAgICAgICAgIG1hcHBlZE5hbWVWYWx1ZSA9ICAoU3RyaW5nTGl0ZXJhbCkgbWFwcGVkTmFtZVZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtYXBwZWROYW1lVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJhbm90aGVyRmllbGQiKSk7Ci0KLSAgICAgICAgICAgIC8vQFdlYk1ldGhvZAotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgIldlYk1ldGhvZCIpKTsKLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViTWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJNZXRob2QgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsKLQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJNZXRob2RBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYk1ldGhvZDsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViTWV0aG9kQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBvcGVyYXRpb25OYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcih3ZWJNZXRob2RBbm5vdGF0aW9uLCAib3BlcmF0aW9uTmFtZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25OYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgb3BlcmF0aW9uTmFtZVZhbHVlID0gIChTdHJpbmdMaXRlcmFsKSBvcGVyYXRpb25OYW1lVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbk5hbWVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImFkZCIpKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnVwZGF0ZU1lbWJlclZhbHVlUGFpcihvcGVyYXRpb25OYW1lVmFsdWVQYWlyLCBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsICJtdWx0aXBseSIpKTsKLSAgICAgICAgICAgIHdlYk1ldGhvZEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICAgICAgb3BlcmF0aW9uTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViTWV0aG9kQW5ub3RhdGlvbiwgIm9wZXJhdGlvbk5hbWUiKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbk5hbWVWYWx1ZSA9ICAoU3RyaW5nTGl0ZXJhbCkgb3BlcmF0aW9uTmFtZVZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25OYW1lVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJtdWx0aXBseSIpKTsKLQotICAgICAgICAgICAgLy9AV2ViUGFyYW0KLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TG9jYWxWYXJpYWJsZShtZXRob2QsICJpIik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGxvY2FsVmFyaWFibGUsICJXZWJQYXJhbSIpKTsKLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlBhcmFtKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViUGFyYW0gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsKLQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJQYXJhbUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViUGFyYW07Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlBhcmFtQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJ0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViUGFyYW1Bbm5vdGF0aW9uLCAicGFydE5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBwYXJ0TmFtZVZhbHVlID0gIChTdHJpbmdMaXRlcmFsKSBwYXJ0TmFtZVZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0TmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiaSIpKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnVwZGF0ZU1lbWJlclZhbHVlUGFpcihwYXJ0TmFtZVZhbHVlUGFpciwgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCAiaWlpIikpOwotICAgICAgICAgICAgd2ViUGFyYW1Bbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGxvY2FsVmFyaWFibGUsIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgICAgIHBhcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcih3ZWJQYXJhbUFubm90YXRpb24sICJwYXJ0TmFtZSIpOwotICAgICAgICAgICAgcGFydE5hbWVWYWx1ZSA9ICAoU3RyaW5nTGl0ZXJhbCkgcGFydE5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocGFydE5hbWVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImlpaSIpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9VcGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWRhMTQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9VcGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQEJpbmRpbmdUeXBlKFwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHBcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgIkJpbmRpbmdUeXBlIikpOwotICAgICAgICAgICAgQW5ub3RhdGlvbiBiaW5kaW5nVHlwZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIEJpbmRpbmdUeXBlLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYmluZGluZ1R5cGUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiaW5kaW5nVHlwZSBpbnN0YW5jZW9mIFNpbmdsZU1lbWJlckFubm90YXRpb24pOwotCi0gICAgICAgICAgICBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGJpbmRpbmdUeXBlQW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBiaW5kaW5nVHlwZTsKLSAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgYmluZGluZ1R5cGVWYWx1ZSA9IChTdHJpbmdMaXRlcmFsKSBiaW5kaW5nVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmluZGluZ1R5cGVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwIikpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMudXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihiaW5kaW5nVHlwZUFubm90YXRpb24sIEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLyIpKTsKLSAgICAgICAgICAgIGJpbmRpbmdUeXBlQW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBCaW5kaW5nVHlwZS5jbGFzcyk7Ci0gICAgICAgICAgICBiaW5kaW5nVHlwZVZhbHVlID0gKFN0cmluZ0xpdGVyYWwpIGJpbmRpbmdUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiaW5kaW5nVHlwZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIikpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxYTQzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTM2NzViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gSnVsIDIwIDE1OjI1OjMxIEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5YmI2ODcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjANCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cw0KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbg0KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXINCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLA0KLSBvcmcuam1vY2ssDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWksDQotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUsDQotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWksDQotIG9yZy5lY2xpcHNlLnVpLmlkZSwNCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksDQotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsDQotIG9yZy5qdW5pdCwNCi0gb3JnLmVjbGlwc2UuamR0LnVpLA0KLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbg0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLmRvbSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5kb20udmFsaWRhdGlvbiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3IsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLmFjdGlvbnMNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjdhY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAyMCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M4OGVmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzQ1MWFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQnVuZGxlLU5hbWUuMD1ET00gSW50ZWdyYXRpb24gVGVzdHMgKEluY3ViYXRpb24pDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9kb20vQWxsVGVzdHNTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9kb20vQWxsVGVzdHNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NGNhNDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvZG9tL0FsbFRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5kb207DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25IZWxwZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25NYW5hZ2VyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLldlYlNlcnZpY2VEZWNvcmF0b3JUZXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0c1N1aXRlDQotew0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLQl7DQotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotDQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERvbVZhbGlkYXRpb25IZWxwZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb21WYWxpZGF0aW9uTWFuYWdlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VEZWNvcmF0b3JUZXN0LmNsYXNzKTsNCi0JCQ0KLQkJcmV0dXJuIHN1aXRlOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvZG9tL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbkhlbHBlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvZG9tL3ZhbGlkYXRpb24vRG9tVmFsaWRhdGlvbkhlbHBlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTk5ZDVjNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25IZWxwZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMuZG9tLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uSGVscGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0RWpiM1Byb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi0NCi0vKioNCi0gKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgRG9tVmFsaWRhdGlvbkhlbHBlcn0uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpDQotcHVibGljIGNsYXNzIERvbVZhbGlkYXRpb25IZWxwZXJUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBEb21WYWxpZGF0aW9uSGVscGVyIGhlbHBlcjsNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgew0KLQkJaGVscGVyID0gbmV3IERvbVZhbGlkYXRpb25IZWxwZXIoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERvbVZhbGlkYXRpb25IZWxwZXIoKSB7CQkNCi0JCWFzc2VydFRydWUoaGVscGVyLmlzUmVnaXN0ZXJlZCgid2ViU2VydmljZVByb2plY3QiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldFdlYlNlcnZpY2VQcm9qZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlUZXN0RWpiM1Byb2plY3QgZWpiUHJvamVjdCA9IG5ldyBUZXN0RWpiM1Byb2plY3QoIkVqYlByb2plY3QiKTsNCi0JCVRlc3RQcm9qZWN0IHRlc3RQcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KGVqYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IHRlc3RQcm9qZWN0LmdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgib3JnLmVsY2lwc2UudGVzdCIsIHRydWUsIG51bGwpOw0KLQkJdGVzdFByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiU2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHt9Iik7DQotCQkNCi0JCWhlbHBlci5zZXRQcm9qZWN0KHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQlhc3NlcnROb3ROdWxsKCJET00gcHJvamVjdCBub3QgcmV0cmlldmVkIiwgaGVscGVyLmdldFdlYlNlcnZpY2VQcm9qZWN0KCJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUiKSk7DQotCQkNCi0JCXRyeSB7DQotCQkJdGVzdFByb2plY3QuZGlzcG9zZSgpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIF8pIHsJDQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXZWJTZXJ2aWNlUHJvamVjdERPTUxvYWRpbmdDYW5jZWxlZCgpIHRocm93cyBFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIE1vY2s8SVdzRE9NUnVudGltZUV4dGVuc2lvbj4gZXh0TW9jayA9IG1vY2soSVdzRE9NUnVudGltZUV4dGVuc2lvbi5jbGFzcyk7DQotCQlleHRNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldERPTSIpLndpbGwodGhyb3dFeGNlcHRpb24obmV3IFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKCIiLCAiIikpKTsNCi0JCWhlbHBlciA9IG5ldyBEb21WYWxpZGF0aW9uSGVscGVyKCkgew0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERvbVJ1bnRpbWUoZmluYWwgU3RyaW5nIGRvbUlkKSB7DQotCQkJCXJldHVybiBleHRNb2NrLnByb3h5KCk7DQotCQkJfQ0KLQkJfTsNCi0JCWFzc2VydE51bGwoIlRoZSBoZWxwZXIgcmV0dXJuZWQgZG9tIGluc3RhbmNlIiwgaGVscGVyLmdldFdlYlNlcnZpY2VQcm9qZWN0KCJzb21lLmRvbSIpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25NYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uTWFuYWdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWFmZjBjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25NYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5kb20udmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklTRUlDaGlsZExpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklXZWJTZXJ2aWNlQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkhlbHBlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25NYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLklEb21WYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuSVdhaXRDb25kaXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucy5Bc3NlcnRpb25zOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmFzc2VydGlvbnMuQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0RWpiM1Byb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC50ZXh0LkpheFdzVXRpbE1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLkZpbGVVdGlsczsNCi0NCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikNCi1wdWJsaWMgY2xhc3MgRG9tVmFsaWRhdGlvbk1hbmFnZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NUX1ZBTElEQVRJT05fWFAgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIjsNCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyZWQoKQ0KLQl7DQotCQlmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFdTVF9WQUxJREFUSU9OX1hQKTsNCi0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLndzVmFsaWRhdG9yIik7DQotCQlhc3NlcnROb3ROdWxsKGV4dGVuc2lvbik7DQotCQkNCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpLCAidmFsaWRhdG9yIik7DQotCQllbGVtZW50ID0gZmluZEVsZW1lbnQoZWxlbWVudC5nZXRDaGlsZHJlbigpLCAicnVuIik7DQotCQlhc3NlcnRFcXVhbHMoRG9tVmFsaWRhdGlvbk1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSk7DQotCX0NCi0JDQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZpbmRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBbXSBjb25maWdFbGVtZW50cywgU3RyaW5nIG5hbWUpIA0KLQl7DQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50IDogY29uZmlnRWxlbWVudHMpIHsNCi0JCQlpZiAoY29uZmlnRWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7DQotCQkJCXJldHVybiBjb25maWdFbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpDQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUNhbGxlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJVGVzdEVqYjNQcm9qZWN0IGVqYlByb2plY3QgPSBuZXcgVGVzdEVqYjNQcm9qZWN0KCJFamJQcm9qZWN0IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCVRlc3RQcm9qZWN0IHRlc3RQcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KGVqYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IHRlc3RQcm9qZWN0LmdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgib3JnLmVjbGlwc2UudGVzdCIsIHRydWUsIG51bGwpOw0KLQkJdGVzdFByb2plY3QuY3JlYXRlVHlwZShwYWNrLCAiU2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHt9Iik7DQotCQkNCi0JCURvbVZhbGlkYXRpb25IZWxwZXIgaGVscGVyID0gbmV3IERvbVZhbGlkYXRpb25IZWxwZXIoKTsNCi0JCWhlbHBlci5zZXRQcm9qZWN0KHRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQ0KLQkJTXlEb21WYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyID0gbmV3IE15RG9tVmFsaWRhdGlvbk1hbmFnZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uamVlNSIpOw0KLQkJbWFuYWdlci52YWxpZGF0ZShoZWxwZXIsIG51bGwpOw0KLQkJYXNzZXJ0VHJ1ZShtYW5hZ2VyLnZhbGlkYXRpb25DYWxsZWQpOw0KLQkJDQotCQltYW5hZ2VyID0gbmV3IE15RG9tVmFsaWRhdGlvbk1hbmFnZXIoInNhbXBsZS5ub3QuZXhpc3RpbmciKTsNCi0JCW1hbmFnZXIudmFsaWRhdGUoaGVscGVyLCBudWxsKTsNCi0JCWFzc2VydEZhbHNlKG1hbmFnZXIudmFsaWRhdGlvbkNhbGxlZCk7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpDQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUNsZWFuc1VwRXJyb3JNYXJrZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBUZXN0UHJvamVjdCB0ZXN0UHJvamVjdCA9IGNyZWF0ZVByb2plY3QoKTsNCi0JCUlUeXBlIHNlaVR5cGUgPSB0ZXN0UHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKCJvcmcuZWNsaXBzZS50ZXN0LlNlaSIpOw0KLQkJc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJDQotCQlEb21WYWxpZGF0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBEb21WYWxpZGF0aW9uSGVscGVyKCk7DQotCQloZWxwZXIuc2V0UHJvamVjdCh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwkJDQotCQlNeURvbVZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTXlEb21WYWxpZGF0aW9uTWFuYWdlcigib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1Iik7DQotCQltYW5hZ2VyLnZhbGlkYXRlKGhlbHBlciwgbnVsbCk7CQ0KLQkJDQotCQltYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcmtlcnMubGVuZ3RoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFJlZnJlc2hUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlJV2ViU2VydmljZSB3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0NCi0JCUlXZWJNZXRob2Qgd20gPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQl3bS5nZXRQYXJhbWV0ZXJzKCkuYWRkKERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJQYXJhbSgpKTsNCi0NCi0JCXNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmFkZCh3cyk7DQotCQlzZWkuZ2V0V2ViTWV0aG9kcygpLmFkZCh3bSk7DQotCQkNCi0JCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZVByb2plY3QoKTsgDQotCQl3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKS5hZGQod3MpOw0KLQkJd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5hZGQoc2VpKTsNCi0JCQ0KLQkJZmluYWwgU2V0PE9iamVjdD4gZWxlbWVudHMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7DQotCQlET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoKSANCi0JCXsJCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgdm9pZCBmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQgKE9iamVjdCBlbGVtZW50KSB7DQotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50LmdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpWzBdKTsNCi0JCQl9CQ0KLQkJfTsNCi0NCi0JCVJ1bm5hYmxlIHJlZnJlc2ggPSBuZXcgTXlEb21WYWxpZGF0aW9uTWFuYWdlcigiIikuZ2V0UmVmcmVzaFJ1bm5hYmxlKGxhYmVsUHJvdmlkZXIsIHdzUHJvamVjdCk7DQotCQlyZWZyZXNoLnJ1bigpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGVsZW1lbnRzLmNvbnRhaW5zKElXZWJTZXJ2aWNlUHJvamVjdC5jbGFzcykpOw0KLQkJYXNzZXJ0VHJ1ZShlbGVtZW50cy5jb250YWlucyhJV2ViU2VydmljZUNoaWxkTGlzdC5jbGFzcykpOw0KLQkJYXNzZXJ0VHJ1ZShlbGVtZW50cy5jb250YWlucyhJU0VJQ2hpbGRMaXN0LmNsYXNzKSk7DQotCQlhc3NlcnRUcnVlKGVsZW1lbnRzLmNvbnRhaW5zKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MpKTsJCQ0KLQkJYXNzZXJ0VHJ1ZShlbGVtZW50cy5jb250YWlucyhJV2ViU2VydmljZS5jbGFzcykpOw0KLQkJYXNzZXJ0VHJ1ZShlbGVtZW50cy5jb250YWlucyhJV2ViTWV0aG9kLmNsYXNzKSk7DQotCQlhc3NlcnRUcnVlKGVsZW1lbnRzLmNvbnRhaW5zKElXZWJQYXJhbS5jbGFzcykpOwkJDQotCX0NCi0JDQotCS8vRklYTUUgVG1wIGNvbW1lbnQgb3V0LiBGYWlsaW5nIGluIGxvY2FsIGJ1aWxkIG9uIEVjbGlwc2UgMy42IE00DQotLy8JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25GcmFtZXdvcmtUcmlnZ2Vyc1ZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlmaW5hbCBUZXN0RWpiM1Byb2plY3QgZWpiUHJvamVjdCA9IG5ldyBUZXN0RWpiM1Byb2plY3QoIkVqYlByb2plY3QiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLS8vCQlmaW5hbCBUZXN0UHJvamVjdCB0ZXN0UHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotLy8JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGFjayA9IHRlc3RQcm9qZWN0LmdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgib3JnLmVjbGlwc2UudGVzdCIsIHRydWUsIG51bGwpOw0KLS8vCQlmaW5hbCBJVHlwZSB3c1R5cGUgPSB0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHBhY2ssICJXcy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiVGVzdFwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0vLwkJdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG51bGwpOw0KLS8vCQkNCi0vLwkJYm9vbGVhbiBhdXRvQnVpbGQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKS5pc0F1dG9CdWlsZGluZygpOw0KLS8vCQl0cnkgew0KLS8vCQkJc2V0QXV0b0J1aWxkKGZhbHNlKTsNCi0vLwkJCXNldENvbnRlbnRzKHdzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiXl5eXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOw0KLS8vCQkJdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG51bGwpOw0KLS8vCQkJQXNzZXJ0aW9ucy53YWl0QXNzZXJ0KG5ldyBJV2FpdENvbmRpdGlvbigpIHsNCi0vLwkJCQlwdWJsaWMgYm9vbGVhbiBjaGVja0NvbmRpdGlvbigpIHRocm93cyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbiB7DQotLy8JCQkJCXRyeSB7DQotLy8JCQkJCQlJTWFya2VyW10gbWFya2Vycz0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotLy8JCQkJCQlmb3IoSU1hcmtlciBtIDogbWFya2VycykNCi0vLwkJCQkJCXsNCi0vLwkJCQkJCQlpZigobS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkgPT0gbnVsbCkgfHwgKG0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkgPT0gbnVsbCkpDQotLy8JCQkJCQkJew0KLS8vCQkJCQkJCQlyZXR1cm4gZmFsc2U7DQotLy8JCQkJCQkJfQ0KLS8vCQkJCQkJCWlmKChJbnRlZ2VyKW0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpID09IElNYXJrZXIuU0VWRVJJVFlfRVJST1IgfHwgSmF4V3NVdGlsTWVzc2FnZXMuV3NkbE5hbWVzVmFsaWRhdG9yX0ludmFsaWROQ05hbWUyLmVxdWFscyhtLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKSkNCi0vLwkJCQkJCQl7DQotLy8JCQkJCQkJCXJldHVybiB0cnVlOw0KLS8vCQkJCQkJCX0NCi0vLwkJCQkJCX0NCi0vLwkJCQkJCXJldHVybiBmYWxzZTsNCi0vLwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotLy8JCQkJCQl0aHJvdyBuZXcgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24oZSk7DQotLy8JCQkJCX0NCi0vLwkJCQl9DQotLy8JCQl9LCANCi0vLwkJCSJFeHBlY3RlZCBlcnJvciBtYXJrZXIgd2FzIG5vdCBmb3VuZCIpOw0KLS8vCQl9DQotLy8JCWZpbmFsbHkgew0KLS8vCQkJc2V0QXV0b0J1aWxkKGF1dG9CdWlsZCk7DQotLy8JCX0NCi0vLwl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50cyhJQ29tcGlsYXRpb25Vbml0IGN1LCBTdHJpbmcgY29udGVudHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIGNvbnRlbnRUb1NldCA9ICJwYWNrYWdlICIrY3UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKSsiO1xuIitjb250ZW50czsNCi0JCUZpbGVVdGlscy5nZXRJbnN0YW5jZSgpLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoY3UsIGNvbnRlbnRUb1NldCwgdHJ1ZSwgbnVsbCk7DQotCX0NCi0JCQ0KLQlwcml2YXRlIHZvaWQgc2V0QXV0b0J1aWxkKGJvb2xlYW4gYXV0bykgdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7DQotCQlkZXNjLnNldEF1dG9CdWlsZGluZyhhdXRvKTsNCi0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBUZXN0UHJvamVjdCBjcmVhdGVQcm9qZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlUZXN0RWpiM1Byb2plY3QgZWpiUHJvamVjdCA9IG5ldyBUZXN0RWpiM1Byb2plY3QoIkVqYlByb2plY3QiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJVGVzdFByb2plY3QgdGVzdFByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gdGVzdFByb2plY3QuZ2V0U291cmNlRm9sZGVyKCkuY3JlYXRlUGFja2FnZUZyYWdtZW50KCJvcmcuZWNsaXBzZS50ZXN0IiwgdHJ1ZSwgbnVsbCk7DQotCQl0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHBhY2ssICJTZWkuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJcIikgcHVibGljIGludGVyZmFjZSBTZWkge30iKTsNCi0JCQ0KLQkJcmV0dXJuIHRlc3RQcm9qZWN0Ow0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlEb21WYWxpZGF0aW9uTWFuYWdlciBleHRlbmRzIERvbVZhbGlkYXRpb25NYW5hZ2VyDQotCXsNCi0JCXB1YmxpYyBib29sZWFuIHZhbGlkYXRpb25DYWxsZWQ7DQotCQlwcml2YXRlIFN0cmluZyBkb21JZDsNCi0JCQ0KLQkJcHVibGljIE15RG9tVmFsaWRhdGlvbk1hbmFnZXIoU3RyaW5nIGRvbUlkKQ0KLQkJew0KLQkJCXRoaXMuZG9tSWQgPSBkb21JZDsgDQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIENvbGxlY3Rpb248SURvbVZhbGlkYXRvcj4gZ2V0VmFsaWRhdG9ycygpDQotCQl7DQotCQkJSURvbVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgSURvbVZhbGlkYXRvcigpDQotCQkJew0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldFN1cHBvcnRlZERvbVJ1bnRpbWUoKSB7DQotCQkJCQlyZXR1cm4gZG9tSWQ7DQotCQkJCX0NCi0NCi0JCQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoRU9iamVjdCBvYmplY3QpIHsNCi0JCQkJCXZhbGlkYXRpb25DYWxsZWQgPSB0cnVlOw0KLQkJCQkJcmV0dXJuIG51bGw7DQotCQkJfX07DQotCQkJDQotCQkJTGlzdDxJRG9tVmFsaWRhdG9yPiB2YWxpZGF0b3JzID0gbmV3IEFycmF5TGlzdDxJRG9tVmFsaWRhdG9yPigpOw0KLQkJCXZhbGlkYXRvcnMuYWRkKHZhbGlkYXRvcik7DQotCQkJDQotCQkJcmV0dXJuIHZhbGlkYXRvcnM7DQotCQl9DQotCQkNCi0JCXB1YmxpYyBSZWZyZXNoUnVubmFibGUgZ2V0UmVmcmVzaFJ1bm5hYmxlKERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQkJew0KLQkJCXJldHVybiBuZXcgUmVmcmVzaFJ1bm5hYmxlKGxhYmVsUHJvdmlkZXIsIHdzUHJvamVjdCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQ5ZWZiNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklTRUlDaGlsZExpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklXZWJTZXJ2aWNlQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0NhbmNlbGVkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0R1bW15Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0c1V0aWxzOw0KLQ0KLXB1YmxpYyBjbGFzcyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgc3RhdGljIFRlc3RQcm9qZWN0IHRlc3RQcmoxOyANCi0JDQotCXByaXZhdGUgc3RhdGljIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMTsNCi0JDQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDsNCi0JDQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldFJlc291cmNlOw0KLQlwcm90ZWN0ZWQgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3Rvcnk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWlmKHRlc3RQcmoxPT1udWxsKQ0KLQkJew0KLQkJCUlQcm9qZWN0IGVqYlByb2plY3QgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVFamIzUHJvamVjdCgiRE9NQ250UHJvdlRlc3RQcm9qZWN0MSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QoZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQkJbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMXtcbiIgKw0KLQkJCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG5hbWU9XCJwYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NJblBhcmVudCgpO1xuIiArDQotCQkJCQkifSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTJOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMiBleHRlbmRzIFNlaTEge1xuIiArDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QobmFtZT1cInZvaWRNZXRob2RXaXRoQXJnc1wiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aEFyZ3MoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIpIGphdmEudXRpbC5MaXN0PFN0cmluZz4gcGFyYW0xKTtcbiIgKw0KLQkJCQkJIn0iKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMk5hbWVcIikgcHVibGljIGNsYXNzIFdTMiB7fSIpOw0KLQkJfQ0KLQkJDQotCQl0YXJnZXRSZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7DQotCQl0YXJnZXRSZXNvdXJjZS5sb2FkKG51bGwpOw0KLQkJSXRlcmF0b3I8SVdlYlNlcnZpY2VQcm9qZWN0PiB3c1Byb2plY3RzID0gdGFyZ2V0UmVzb3VyY2UuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuaXRlcmF0b3IoKTsNCi0JCQ0KLQkJd2hpbGUod3NQcm9qZWN0cy5oYXNOZXh0KCkpDQotCQl7DQotCQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvaiA9IHdzUHJvamVjdHMubmV4dCgpOw0KLQkJCQ0KLQkJCWlmKHdzUHJvai5nZXROYW1lKCkuZXF1YWxzKHRlc3RQcmoxLmdldFByb2plY3QoKS5nZXROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJdGhpcy53c1Byb2plY3QgPSB3c1Byb2o7DQotCQkJfQ0KLQkJfQ0KLQkJCQkNCi0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QpOw0KLQkJDQotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpIA0KLQkJew0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZ2V0V3NQcm9qZWN0KGZpbmFsIElET00gZG9tLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7DQotCQkJCXJldHVybiB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJdGFyZ2V0UmVzb3VyY2Uuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldFJlc291cmNlLnN0b3BTeW5jaHJvbml6aW5nKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpIA0KLQl7DQotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJGYWN0b3J5KCkpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyRmFjdG9yeSgpIGluc3RhbmNlb2YgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgDQotCXsNCi0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKG5ldyBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckZhY3RvcnkoKSBpbnN0YW5jZW9mIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGRyZW5MaXN0c09iamVjdCgpIA0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoY2hpbGRyZW4pOw0KLQkJYXNzZXJ0RXF1YWxzKGNoaWxkcmVuLmxlbmd0aCwgMSk7DQotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KTsNCi0JCQ0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoY2hpbGRyZW4pOw0KLQkJYXNzZXJ0RXF1YWxzKGNoaWxkcmVuLmxlbmd0aCwgMik7DQotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCk7DQotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzFdIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpOw0KLQkJDQotCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHNFSXMpOw0KLQkJYXNzZXJ0RXF1YWxzKDMsIHNFSXMubGVuZ3RoKTsNCi0JCWFzc2VydFRydWUoc0VJc1swXSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOw0KLQkJYXNzZXJ0VHJ1ZShzRUlzWzFdIGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7DQotCQlhc3NlcnRUcnVlKHNFSXNbMl0gaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsNCi0JCQ0KLQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMV0pOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdTcyk7DQotCQlhc3NlcnRFcXVhbHMod1NzLmxlbmd0aCwgMik7DQotCQlhc3NlcnRUcnVlKHdTc1swXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKTsNCi0JCWFzc2VydFRydWUod1NzWzFdIGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQ2hpbGRyZW5PYmplY3QoKSANCi0Jew0KLQkJLy8gSVdlYlNlcnZpY2VQcm9qZWN0DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQkNCi0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4oY2hpbGRyZW5bMF0pKTsNCi0JCQ0KLQkJLy8gSVNFSUNoaWxkTGlzdCAmIElXZWJTZXJ2aWNlQ2hpbGRMaXN0DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihjaGlsZHJlblswXSkpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihjaGlsZHJlblsxXSkpOw0KLQkJDQotCQkvLyBudWxsIHBhcmFtZXRlcg0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4obnVsbCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5JV2ViU2VydmljZSgpDQotCXsNCi0JCUlXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuV1MxIik7DQotCQlhc3NlcnROb3ROdWxsKHdzKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4od3MpKTsNCi0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cykubGVuZ3RoKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4od3MpWzBdIGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7DQotCQkNCi0JCS8vIGNoZWNrIGlmIGFkYXB0ZWQgb25seSBvbmNlDQotCQlET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBvdGhlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKTsNCi0JCW90aGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cyk7DQotCQlhc3NlcnRFcXVhbHMoMiwgd3MuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENoaWxkcmVuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCXsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZmluZFNlaSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTIiKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuaGFzQ2hpbGRyZW4oc2VpKSk7DQotCQlhc3NlcnRFcXVhbHMoMiwgYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oc2VpKS5sZW5ndGgpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzZWkpWzBdIGluc3RhbmNlb2YgSVdlYk1ldGhvZCk7DQotCQlET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBvdGhlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKTsNCi0JCW90aGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzZWkpOw0KLQkJYXNzZXJ0RXF1YWxzKDIsIHNlaS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJDQotCQlJV2ViU2VydmljZSB3cyA9IGZpbmRXcygib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLldTMiIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3cyk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbih3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpKS5sZW5ndGgpOw0KLQkJLy8gY2hlY2sgaWYgYWRhcHRlZCBvbmx5IG9uY2UNCi0JCW90aGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCQlhc3NlcnRFcXVhbHMoMiwgd3MuZ2V0U2VydmljZUVuZHBvaW50KCkuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENoaWxkcmVuV2ViTWV0aG9kKCkNCi0Jew0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBmaW5kU2VpKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkpOw0KLQkJDQotCQlJV2ViTWV0aG9kIG1ldGhvZCA9IGZpbmRNZXRob2Qoc2VpLCAidm9pZE1ldGhvZFdpdGhBcmdzIik7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7CQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihtZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihtZXRob2QpLmxlbmd0aCk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKG1ldGhvZClbMF0gaW5zdGFuY2VvZiBJV2ViUGFyYW0pOw0KLQkJDQotCQkgbWV0aG9kID0gZmluZE1ldGhvZChzZWksICJ2b2lkTWV0aG9kV2l0aE5vQXJnc0luUGFyZW50Iik7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihtZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihtZXRob2QpLmxlbmd0aCk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENoaWxkcmVuV2ViUGFyYW0oKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyIik7DQotCQlhc3NlcnROb3ROdWxsKHNlaSk7DQotCQkNCi0JCUlXZWJNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZChzZWksICJ2b2lkTWV0aG9kV2l0aEFyZ3MiKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4obWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkpLmxlbmd0aCk7DQotCX0NCi0JDQotCQ0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZmluZFNlaShmaW5hbCBTdHJpbmcgaW1wbE5hbWUpDQotCXsNCi0JCWZvcihJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpIA0KLQkJew0KLQkJCWlmKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsTmFtZSkpIHsNCi0JCQkJcmV0dXJuIHNlaTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9CQ0KLQkNCi0JcHJpdmF0ZSBJV2ViU2VydmljZSBmaW5kV3MoZmluYWwgU3RyaW5nIGltcGxOYW1lKQ0KLQl7DQotCQlmb3IoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkgDQotCQl7DQotCQkJaWYod3MuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbE5hbWUpKSB7DQotCQkJCXJldHVybiB3czsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9CQ0KLQkNCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIGZpbmRNZXRob2QoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lKSANCi0Jew0KLQkJZm9yKElXZWJNZXRob2QgbWV0aG9kIDogc2VpLmdldFdlYk1ldGhvZHMoKSkgDQotCQl7DQotCQkJaWYobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsNCi0JCQkJcmV0dXJuIG1ldGhvZDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLS8vCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlDaGFuZ2VkKCkNCi0vLwl7DQotLy8JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0vLwkJDQotLy8JCXRyeQ0KLS8vCQl7DQotLy8JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkzTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTMge30iKTsNCi0vLwkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTM05hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpM1wiKSBwdWJsaWMgY2xhc3MgV1MzIHt9Iik7DQotLy8JCX0NCi0vLwkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpDQotLy8JCXsNCi0vLwkJCWZhaWwoZS50b1N0cmluZygpKTsNCi0vLwkJfQ0KLS8vCQkNCi0vLwkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotLy8JCQ0KLS8vCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLS8vCQkNCi0vLwkJYXNzZXJ0RXF1YWxzKHNFSXMubGVuZ3RoLCAzKTsNCi0vLwkJDQotLy8JCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzFdKTsNCi0vLwkJDQotLy8JCWFzc2VydEVxdWFscyh3U3MubGVuZ3RoLCAzKTsNCi0vLwl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V1NQcm9qZWN0KCkNCi0Jew0KLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKTsNCi0JCQ0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXc1Byb2plY3REb21Ob3RMb2FkZWQoKQ0KLQl7DQotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpIHsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChmaW5hbCBJRE9NIGRvbSwgZmluYWwgSVByb2plY3QgcHJvamVjdCkgew0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotCQl9Ow0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkcmVuLmxlbmd0aCk7DQotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgSUxvYWRpbmdXc1Byb2plY3QpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRyZW4ubGVuZ3RoKTsNCi0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJTG9hZGluZ0R1bW15KTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldFdzUHJvamVjdENoaWxkc0RvbUxvYWROb3RDYW5jZWxlZCgpDQotCXsNCi0JCUlMb2FkaW5nV3NQcm9qZWN0IGxvYWRpbmdQcm9qZWN0ID0gbmV3IElMb2FkaW5nV3NQcm9qZWN0KCkgew0KLQkJCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeyByZXR1cm4gbnVsbDsgfQ0KLQkJCXB1YmxpYyBib29sZWFuIGlzTG9hZENhbmNlbGVkKCkge3JldHVybiBmYWxzZTt9DQotCQl9Ow0KLQkJCQ0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihsb2FkaW5nUHJvamVjdCk7DQotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRyZW4ubGVuZ3RoKTsNCi0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJTG9hZGluZ0R1bW15KTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V3NQcm9qZWN0Q2hpbGRzRG9tTG9hZENhbmNlbGVkKCkNCi0Jew0KLQkJSUxvYWRpbmdXc1Byb2plY3QgbG9hZGluZ1Byb2plY3QgPSBuZXcgSUxvYWRpbmdXc1Byb2plY3QoKSB7DQotCQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7IHJldHVybiBudWxsOyB9DQotCQkJcHVibGljIGJvb2xlYW4gaXNMb2FkQ2FuY2VsZWQoKSB7cmV0dXJuIHRydWU7fQ0KLQkJfTsNCi0JCQkNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4obG9hZGluZ1Byb2plY3QpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkcmVuLmxlbmd0aCk7DQotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgSUxvYWRpbmdDYW5jZWxlZCk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldFN1cHBvcnRpbmdSdW50aW1lKCkNCi0Jew0KLQkJRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJNeSBwcm92aWRlciA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlck15KCk7DQotCQlJV3NET01SdW50aW1lRXh0ZW5zaW9uIHJ1bnRpbWUgPSBwcm92aWRlci5nZXRTdXBwb3J0aW5nUnVudGltZSh0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChydW50aW1lKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyTXkgZXh0ZW5kcyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcg0KLQl7DQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldFN1cHBvcnRpbmdSdW50aW1lKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsNCi0JCQlyZXR1cm4gc3VwZXIuZ2V0U3VwcG9ydGluZ1J1bnRpbWUocHJvamVjdCk7DQotCQl9DQotCX07DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTU0ODc2MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3RzVXRpbHM7DQotDQotcHVibGljIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgc3RhdGljIFRlc3RQcm9qZWN0IHRlc3RQcmoxOyANCi0JDQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldFJlc291cmNlOw0KLQlwcm90ZWN0ZWQgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3Rvcnk7DQotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsNCi0JDQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gDQotCXsNCi0JCWlmKHRlc3RQcmoxPT1udWxsKQ0KLQkJew0KLQkJCUlQcm9qZWN0IGVqYlByb2plY3QgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVFamIzUHJvamVjdCgiRE9NTGJsUHJvdlRlc3RQcm9qZWN0MSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QoZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMxID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxIik7DQotCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU2VpMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxe1xuIiArDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QobmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc0luUGFyZW50KCk7XG4iICsNCi0JCQkJCSJ9Iik7DQotCQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU2VpMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMk5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkyIGV4dGVuZHMgU2VpMSB7XG4iICsNCi0JCQkJCSJAamF2YXguandzLldlYk1ldGhvZChuYW1lPVwid2ViTWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm90SW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkJIn0iKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMk5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MyIHt9Iik7DQotCQl9DQotCQkNCi0JCXRhcmdldFJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsNCi0JCXRhcmdldFJlc291cmNlLmxvYWQobnVsbCk7DQotCQlJdGVyYXRvcjxJV2ViU2VydmljZVByb2plY3Q+IHdzUHJvamVjdHMgPSB0YXJnZXRSZXNvdXJjZS5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5pdGVyYXRvcigpOw0KLQkJDQotCQl3aGlsZSh3c1Byb2plY3RzLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qID0gd3NQcm9qZWN0cy5uZXh0KCk7DQotCQkJDQotCQkJaWYod3NQcm9qLmdldE5hbWUoKS5lcXVhbHModGVzdFByajEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQl0aGlzLndzUHJvamVjdCA9IHdzUHJvajsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QpOw0KLQkJDQotCQlsYWJlbFByb3ZpZGVyID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigpOw0KLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKSANCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChmaW5hbCBJRE9NIGRvbSwgZmluYWwgSVByb2plY3QgcHJvamVjdCkgew0KLQkJCQlyZXR1cm4gd3NQcm9qZWN0Ow0KLQkJCX0JCQkNCi0JCX07DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEltYWdlT2JqZWN0KCkgDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKGNoaWxkcmVuWzBdKSk7DQotDQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKGNoaWxkcmVuWzBdKSk7DQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoY2hpbGRyZW5bMV0pKTsNCi0JCQ0KLQkJT2JqZWN0W10gc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKHNFSXNbMF0pKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHNFSXNbMF0pKTsNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZSh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uoc0VJc1swXSkpOw0KLQkJDQotCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblsxXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRJbWFnZSh3U3NbMF0pKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdTc1swXSkpOw0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXRJbWFnZSh3U3NbMF0pKTsNCi0JCQ0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHNFSXNbMF0pOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uod2ViTWV0aG9kc1swXSkpOw0KLQkJDQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UobnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uod2ViTWV0aG9kc1swXSkpOw0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXRJbWFnZSh3ZWJNZXRob2RzWzBdKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldFRleHRPYmplY3QoKSANCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChjaGlsZHJlblswXSkpOw0KLQ0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRUZXh0KGNoaWxkcmVuWzBdKSk7DQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChjaGlsZHJlblsxXSkpOw0KLQkJDQotCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChzRUlzWzBdKSk7DQotCQkNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRUZXh0KG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQoc0VJc1swXSkpOw0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldFRleHQodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQoc0VJc1swXSkpOw0KLQkJDQotCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblsxXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRUZXh0KHdTc1swXSkpOw0KLQkJDQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgbGFiZWxQcm92aWRlci5nZXRUZXh0KHdTc1swXSkpOw0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldFRleHQodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQod1NzWzBdKSk7DQotCQkNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzRUlzWzBdKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQod2ViTWV0aG9kc1swXSkpOw0KLQkJDQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgbGFiZWxQcm92aWRlci5nZXRUZXh0KHdlYk1ldGhvZHNbMF0pKTsNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRUZXh0KHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXRUZXh0KHdlYk1ldGhvZHNbMF0pKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldERlc2NyaXB0aW9uKCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oY2hpbGRyZW5bMF0pKTsNCi0NCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oY2hpbGRyZW5bMF0pKTsNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihjaGlsZHJlblsxXSkpOw0KLQkJDQotCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oc0VJc1swXSkpOw0KLQkJDQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24obnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oc0VJc1swXSkpOw0KLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihzRUlzWzBdKSk7DQotCQkNCi0JCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzFdKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdTc1swXSkpOw0KLQkJDQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24obnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od1NzWzBdKSk7DQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24odGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdTc1swXSkpOw0KLQkJDQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oc0VJc1swXSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih3ZWJNZXRob2RzWzBdKSk7DQotCQkNCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihudWxsKSwgbGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih3ZWJNZXRob2RzWzBdKSk7DQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24odGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdlYk1ldGhvZHNbMF0pKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhN2Y5MTE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7DQotDQotcHVibGljIGNsYXNzIERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHVibGljIHZvaWQgdGVzdEdldEFkYXB0ZXIoKSANCi0Jew0KLQkJRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkgcHJvcGVydHlBZGFwdGVyRmFjdG9yeSA9IG5ldyBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBJUHJvcGVydHlTb3VyY2VQcm92aWRlci5jbGFzcykpOw0KLQkJYXNzZXJ0TnVsbChwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgSVdlYlNlcnZpY2UuY2xhc3MpKTsNCi0JCWFzc2VydFRydWUocHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHByb3BlcnR5QWRhcHRlckZhY3RvcnksIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmNsYXNzKSBpbnN0YW5jZW9mIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKTsNCi0JCWFzc2VydFRydWUocHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHByb3BlcnR5QWRhcHRlckZhY3RvcnksIERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5LmNsYXNzKSBpbnN0YW5jZW9mIERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWRhcHRlckxpc3QoKSANCi0Jew0KLQkJRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkgcHJvcGVydHlBZGFwdGVyRmFjdG9yeSA9IG5ldyBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckxpc3QoKSk7DQotCQlhc3NlcnRFcXVhbHMocHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyTGlzdCgpLmxlbmd0aCwgMSk7DQotCQlhc3NlcnRFcXVhbHMocHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyTGlzdCgpWzBdLCBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBZGFwdGVyVXNlc1NhbWVGYWN0b3J5KCkNCi0Jew0KLQkJRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkgcHJvcGVydHlBZGFwdGVyRmFjdG9yeSA9IG5ldyBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSgpOw0KLQkJT2JqZWN0IGFkYXB0ZXIxID0gcHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHByb3BlcnR5QWRhcHRlckZhY3RvcnksIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmNsYXNzKTsNCi0JCWFzc2VydE5vdE51bGwoYWRhcHRlcjEpOw0KLQkJT2JqZWN0IGFkYXB0ZXIyID0gcHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHByb3BlcnR5QWRhcHRlckZhY3RvcnksIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmNsYXNzKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlcjE9PWFkYXB0ZXIyKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9XZWJTZXJ2aWNlRGVjb3JhdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvV2ViU2VydmljZURlY29yYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWZjOTVmNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9XZWJTZXJ2aWNlRGVjb3JhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5DdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVNFSUNoaWxkTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVdlYlNlcnZpY2VDaGlsZExpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLldlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yLlNldmVyaXR5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uLkRvbVZhbGlkYXRpb25Db25zdGFudHM7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBXZWJTZXJ2aWNlRGVjb3JhdG9yfSBjbGFzcw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZURlY29yYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgVGVzdFdlYlNlcnZpY2VEZWNvcmF0b3IgZGVjb3JhdG9yID0gbmV3IFRlc3RXZWJTZXJ2aWNlRGVjb3JhdG9yKCk7Ow0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IHRlc3RQcm9qZWN0Ow0KLQlwcml2YXRlIElUeXBlIHNlaVR5cGU7DQotCXByaXZhdGUgSVR5cGUgd3NUeXBlOw0KLQkNCi0JcHJpdmF0ZSBEb21VdGlsIGRvbVV0aWwgPSBEb21VdGlsLklOU1RBTkNFOw0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzOw0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpOw0KLQlwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0ZXN0UHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdCgpOw0KLQkJdGVzdFByb2plY3QuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IHRlc3RQcm9qZWN0LmNyZWF0ZVBhY2thZ2UoInRlc3QiKTsNCi0JCXNlaVR5cGUgPSB0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHBhY2ssICJTZWkuamF2YSIsICJwdWJsaWMgaW50ZXJmYWNlIFNlaSB7fSIpOw0KLQkJDQotCQlzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQlzZWkuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCBzZWlUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0NCi0JCXdzVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUocGFjaywgIldzLmphdmEiLCAicHVibGljIGNsYXNzIFdzIHt9Iik7DQotCQl3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQl3cy5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIHdzVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQkNCi0JCXdzUHJvamVjdCA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdCgpOw0KLQkJd3NQcm9qZWN0LmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQl3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmFkZChzZWkpOw0KLQkJd3NQcm9qZWN0LmdldFdlYlNlcnZpY2VzKCkuYWRkKHdzKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU2V2ZXJpdHlGb3JPYmplY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0Jew0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5Lk9LLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkobmV3IEludGVnZXIoMSkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNldmVyaXR5Rm9yUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7DQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuT0ssIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eSh3c1Byb2plY3QpKTsNCi0JCQ0KLQkJSU1hcmtlciBtYXJrZXIgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CQkNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5FUlJPUiwgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHdzUHJvamVjdCkpOw0KLQ0KLQkJc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmRlbGV0ZU1hcmtlcnMoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5PSywgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHdzUHJvamVjdCkpOw0KLQ0KLQkJbWFya2VyID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOw0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkVSUk9SLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkod3NQcm9qZWN0KSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTZXZlcml0eUZvcklTRUlDaGlsZExpc3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0Jew0KLQkJQWRhcHRlciBhZGFwdGVyID0gQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod3NQcm9qZWN0LCBJU0VJQ2hpbGRMaXN0LmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5PSywgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KGFkYXB0ZXIpKTsJDQotCQkNCi0JCUlNYXJrZXIgbWFya2VyID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRVJST1IsIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eShhZGFwdGVyKSk7CQkJDQotCQkNCi0JCWFkYXB0ZXIgPSBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3c1Byb2plY3QsIElXZWJTZXJ2aWNlQ2hpbGRMaXN0LmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5PSywgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KGFkYXB0ZXIpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU2V2ZXJpdHlGb3JJV2ViU2VydmljZUNoaWxkTGlzdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7DQotCQlBZGFwdGVyIGFkYXB0ZXIgPSBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3c1Byb2plY3QsIElXZWJTZXJ2aWNlQ2hpbGRMaXN0LmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5PSywgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KGFkYXB0ZXIpKTsJDQotCQkNCi0JCUlNYXJrZXIgbWFya2VyID0gd3NUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7DQotCQkNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5FUlJPUiwgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KGFkYXB0ZXIpKTsJCQkNCi0JCQ0KLQkJYWRhcHRlciA9IEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzUHJvamVjdCwgSVNFSUNoaWxkTGlzdC5jbGFzcyk7DQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuT0ssIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eShhZGFwdGVyKSk7CQkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTZXZlcml0eUlXZWJTZXJ2aWNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5Lk9LLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkod3MpKTsNCi0JCQ0KLQkJSU1hcmtlciBtYXJrZXIgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5jcmVhdGVNYXJrZXIoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQpOw0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkVSUk9SLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkod3MpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNldmVyaXR5SVdlYlNlcnZpY2VXcm9uZ1NlaSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUlNYXJrZXIgbWFya2VyID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOw0KLQ0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5Lk9LLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkod3MpKTsNCi0NCi0JCXNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmFkZCh3cyk7DQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRVJST1IsIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eSh3cykpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU2V2ZXJpdHlTZWkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuT0ssIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eShzZWkpKTsNCi0JCQ0KLQkJSU1hcmtlciBtYXJrZXIgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7DQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRVJST1IsIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eShzZWkpKTsNCi0JCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU2V2ZXJpdHlTZWlXcm9uZ01ldGhvZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5PSywgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHNlaSkpOw0KLQkJDQotCQlJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IGNyZWF0ZU1ldGhvZCh0cnVlKTsNCi0JCUlNYXJrZXIgbWFya2VyID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwkJDQotCQltYXJrZXIuc2V0QXR0cmlidXRlKERvbVZhbGlkYXRpb25Db25zdGFudHMuSU1QTEVNRU5UQVRJT04sIGRvbVV0aWwuY2FsY1VuaXF1ZUltcGwod2ViTWV0aG9kKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5FUlJPUiwgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHNlaSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU2V2ZXJpdHlTZWlXcm9uZ1BhcmFtKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5Lk9LLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkoc2VpKSk7DQotCQkNCi0JCUlXZWJNZXRob2Qgd2ViTWV0aG9kID0gY3JlYXRlTWV0aG9kKHRydWUpOw0KLQkJSU1hcmtlciBtYXJrZXIgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CQkNCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5JTVBMRU1FTlRBVElPTiwgZG9tVXRpbC5jYWxjVW5pcXVlSW1wbCh3ZWJNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKSkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRVJST1IsIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eShzZWkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNldmVyaXR5RU9iamVjdElSZXNvdXJjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7CQkNCi0JCUlNYXJrZXIgbWFya2VyID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwkJDQotCQlhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRVJST1IsIGRlY29yYXRvci5kZWZpbmVTZXZlcml0eShzZWksIHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSkpOw0KLQ0KLQkJYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkVSUk9SLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkod3NQcm9qZWN0LCB0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpKTsNCi0NCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5XQVJOSU5HLCBkZWNvcmF0b3IuZGVmaW5lU2V2ZXJpdHkoc2VpLCBzZWlUeXBlLmdldFJlc291cmNlKCkpKTsNCi0NCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9JTkZPKTsNCi0JCWFzc2VydEVxdWFscyhTZXZlcml0eS5PSywgZGVjb3JhdG9yLmRlZmluZVNldmVyaXR5KHNlaSwgc2VpVHlwZS5nZXRSZXNvdXJjZSgpKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdElzUmVsZXZhbnRGb3JNZXRob2QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSBjcmVhdGVNZXRob2QoZmFsc2UpOw0KLQkJDQotCQlJTWFya2VyIG1hcmtlciA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5jcmVhdGVNYXJrZXIoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQpOw0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShEb21WYWxpZGF0aW9uQ29uc3RhbnRzLklNUExFTUVOVEFUSU9OLCBkb21VdGlsLmNhbGNVbmlxdWVJbXBsKHdlYk1ldGhvZCkpOw0KLQkJYXNzZXJ0VHJ1ZShkZWNvcmF0b3IuaXNSZWxldmFudEZvck1ldGhvZCh3ZWJNZXRob2QsIG1hcmtlcikpOw0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShEb21WYWxpZGF0aW9uQ29uc3RhbnRzLklNUExFTUVOVEFUSU9OLCAib3RoZXIiKTsNCi0JCWFzc2VydEZhbHNlKGRlY29yYXRvci5pc1JlbGV2YW50Rm9yTWV0aG9kKHdlYk1ldGhvZCwgbWFya2VyKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdElzUmVsZXZhbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0Jew0KLQkJSU1hcmtlciBtYXJrZXIgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuY3JlYXRlTWFya2VyKERvbVZhbGlkYXRpb25Db25zdGFudHMuTUFSS0VSX0lEKTsNCi0JCWFzc2VydEZhbHNlKGRlY29yYXRvci5pc1JlbGV2YW50KCJpbXBsIiwgbWFya2VyKSk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKERvbVZhbGlkYXRpb25Db25zdGFudHMuSU1QTEVNRU5UQVRJT04sICJpbXBsIik7DQotCQlhc3NlcnRUcnVlKGRlY29yYXRvci5pc1JlbGV2YW50KCJpbXBsIiwgbWFya2VyKSk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKERvbVZhbGlkYXRpb25Db25zdGFudHMuSU1QTEVNRU5UQVRJT04sICJpbXBsIik7DQotCQlhc3NlcnRGYWxzZShkZWNvcmF0b3IuaXNSZWxldmFudCgibmV3SW1wbCIsIG1hcmtlcikpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc1JlbGV2YW50Rm9yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCXsNCi0JCUlNYXJrZXIgbWFya2VyID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmNyZWF0ZU1hcmtlcihEb21WYWxpZGF0aW9uQ29uc3RhbnRzLk1BUktFUl9JRCk7DQotCQlhc3NlcnRUcnVlKGRlY29yYXRvci5pc1JlbGV2YW50Rm9yKHNlaSwgbWFya2VyKSk7DQotCQlJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IGNyZWF0ZU1ldGhvZChmYWxzZSk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKERvbVZhbGlkYXRpb25Db25zdGFudHMuSU1QTEVNRU5UQVRJT04sIGRvbVV0aWwuY2FsY1VuaXF1ZUltcGwod2ViTWV0aG9kKSk7DQotCQlhc3NlcnRUcnVlKGRlY29yYXRvci5pc1JlbGV2YW50Rm9yKHdlYk1ldGhvZCwgbWFya2VyKSk7DQotCQl3ZWJNZXRob2QgPSBjcmVhdGVNZXRob2QodHJ1ZSk7DQotCQltYXJrZXIuc2V0QXR0cmlidXRlKERvbVZhbGlkYXRpb25Db25zdGFudHMuSU1QTEVNRU5UQVRJT04sIGRvbVV0aWwuY2FsY1VuaXF1ZUltcGwod2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkpKTsNCi0JCWFzc2VydFRydWUoZGVjb3JhdG9yLmlzUmVsZXZhbnRGb3Iod2ViTWV0aG9kLCBtYXJrZXIpKTsNCi0JCWFzc2VydFRydWUoZGVjb3JhdG9yLmlzUmVsZXZhbnRGb3Iod2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCksIG1hcmtlcikpOw0KLQkJbWFya2VyLnNldEF0dHJpYnV0ZShEb21WYWxpZGF0aW9uQ29uc3RhbnRzLklNUExFTUVOVEFUSU9OLCAiaW1wbCIpOw0KLQkJYXNzZXJ0RmFsc2UoZGVjb3JhdG9yLmlzUmVsZXZhbnRGb3Iod2ViTWV0aG9kLCBtYXJrZXIpKTsNCi0JCWFzc2VydEZhbHNlKGRlY29yYXRvci5pc1JlbGV2YW50Rm9yKHdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLCBtYXJrZXIpKTsJCQ0KLQl9DQotCQ0KLQlwcml2YXRlIElXZWJNZXRob2QgY3JlYXRlTWV0aG9kKGJvb2xlYW4gd2l0aFBhcmFtKSANCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQl3ZWJNZXRob2QuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAibWV0aG9kKEkpIik7DQotCQkNCi0JCWlmICh3aXRoUGFyYW0pIA0KLQkJew0KLQkJCWZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJQYXJhbSgpOw0KLQkJCXdlYlBhcmFtLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgImEiKTsNCi0JCQl3ZWJNZXRob2QuZ2V0UGFyYW1ldGVycygpLmFkZCh3ZWJQYXJhbSk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3ZWJNZXRob2Q7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUZXN0V2ViU2VydmljZURlY29yYXRvciBleHRlbmRzIFdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvcg0KLQl7DQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBib29sZWFuIGlzUmVsZXZhbnQoZmluYWwgU3RyaW5nIGltcGxlbWVudGF0aW9uLCBmaW5hbCBJTWFya2VyIG1hcmtlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJCXJldHVybiBzdXBlci5pc1JlbGV2YW50KGltcGxlbWVudGF0aW9uLCBtYXJrZXIpOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBib29sZWFuIGlzUmVsZXZhbnRGb3IoZmluYWwgRU9iamVjdCBlT2JqZWN0LCBmaW5hbCBJTWFya2VyIG1hcmtlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJCXJldHVybiBzdXBlci5pc1JlbGV2YW50Rm9yKGVPYmplY3QsIG1hcmtlcik7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvck1ldGhvZChmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gc3VwZXIuaXNSZWxldmFudEZvck1ldGhvZCh3ZWJNZXRob2QsIG1hcmtlcik7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIFNldmVyaXR5IGRlZmluZVNldmVyaXR5KGZpbmFsIEVPYmplY3QgZU9iamVjdCwgZmluYWwgSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkJcmV0dXJuIHN1cGVyLmRlZmluZVNldmVyaXR5KGVPYmplY3QsIHJlc291cmNlKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgU2V2ZXJpdHkgZGVmaW5lU2V2ZXJpdHkoZmluYWwgT2JqZWN0IG9iaikgew0KLQkJCXJldHVybiBzdXBlci5kZWZpbmVTZXZlcml0eShvYmopOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25BYnN0cmFjdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25BYnN0cmFjdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTk4NDVjOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9hY3Rpb25zL1dTQWN0aW9uQWJzdHJhY3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5hY3Rpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVNFSUNoaWxkTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVdlYlNlcnZpY2VDaGlsZExpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnMuV1NBY3Rpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdHNVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5leHRlbnNpb25zLkNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uVmlld2VyU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLk5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlRmFjdG9yeTsNCi0NCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQ0KLXB1YmxpYyBjbGFzcyBXU0FjdGlvbkFic3RyYWN0VGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXByb3RlY3RlZCBzdGF0aWMgVGVzdFByb2plY3QgdGVzdFByajE7IA0KLQlwcm90ZWN0ZWQgc3RhdGljIFRlc3RQcm9qZWN0IHRlc3RQcmoyOyANCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXN0UHJvamVjdCB0ZXN0UHJqMzsNCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXN0UHJvamVjdCB0ZXN0UHJqNDsNCi0JDQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDE7DQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDI7DQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDM7DQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDQ7DQotCQ0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMxOw0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMyOw0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMzOw0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmM0Ow0KLQkNCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2U7DQotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBhZGFwdGVyRmFjdG9yeTsNCi0JDQotCXByb3RlY3RlZCBXU0FjdGlvblByb3ZpZGVyIHdzQWN0aW9uUHJvdiA9IG51bGw7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWlmKHRlc3RQcmoxPT1udWxsKQ0KLQkJew0KLQkJCUlQcm9qZWN0IGVqYlByb2plY3QgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVFamIzUHJvamVjdCgiRE9NV1NBY3Rpb25UZXN0UHJvamVjdDEiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJCXRlc3RQcmoxID0gbmV3IFRlc3RQcm9qZWN0KGVqYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJCW1vZGVsU3luYzEgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEiKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTF7XG4iICsNCi0JCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzSW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkJIn0iKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkyTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTIgZXh0ZW5kcyBTZWkxIHtcbiIgKw0KLQkJCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJNZXRob2RcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb3RJblBhcmVudCgpO1xuIiArDQotCQkJCQkifSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMS5qYXZhIiwgIkBqYXZheC5lamIuU3RhdGVsZXNzXG4iICsgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQkJDQotCQl9DQotCQkNCi0JCWlmKHRlc3RQcmoyPT1udWxsKQ0KLQkJew0KLQkJCUlQcm9qZWN0IHdlYlByb2plY3QgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVXZWIyNVByb2plY3QoIkRPTVdTQWN0aW9uVGVzdFByb2plY3QyIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCQl0ZXN0UHJqMiA9IG5ldyBUZXN0UHJvamVjdCh3ZWJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQkJdGVzdFByajIuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCQltb2RlbFN5bmMyID0gdGVzdFByajIuY3JlYXRlUGFja2FnZSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMyIik7DQotCQkJdGVzdFByajIuY3JlYXRlVHlwZShtb2RlbFN5bmMyLCAiU2VpMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxe1xuIiArDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc0luUGFyZW50KCk7XG4iICsNCi0JCQkJCSJ9Iik7DQotCQkJdGVzdFByajIuY3JlYXRlVHlwZShtb2RlbFN5bmMyLCAiU2VpMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMk5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkyIGV4dGVuZHMgU2VpMSB7XG4iICsNCi0JCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm90SW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkJIn0iKTsNCi0JCQl0ZXN0UHJqMi5jcmVhdGVUeXBlKG1vZGVsU3luYzIsICJXUzEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJfQ0KLQkJDQotCQlpZih0ZXN0UHJqMz09bnVsbCkNCi0JCXsNCi0JCQlJUHJvamVjdCBlamJQcm9qZWN0ID0gVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlRWpiM1Byb2plY3QoIkRPTVdTQWN0aW9uVGVzdFByb2plY3QzIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCQl0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQkJdGVzdFByajMuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCQltb2RlbFN5bmMzID0gdGVzdFByajMuY3JlYXRlUGFja2FnZSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMzIik7DQotCQkJdGVzdFByajMuY3JlYXRlVHlwZShtb2RlbFN5bmMzLA0KLQkJCQkJIldTMS5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpMU5hbWVcIikgcHVibGljIGNsYXNzIFdTMSB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwic3VwZXJQYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgc3VwZXJQYXJlbnRNZXRob2QoKSB7fVxuIg0KLQkJCQkJKyAifSIpOw0KLQkJCQ0KLQkJCXRlc3RQcmozLmNyZWF0ZVR5cGUobW9kZWxTeW5jMywNCi0JCQkJCSJXUzIuamF2YSIsDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTJOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzIgZXh0ZW5kcyBXUzEge1xuIg0KLQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCBwYXJlbnRNZXRob2QoKSB7fVxuIg0KLQkJCQkJKyAifSIpOw0KLQkJCQ0KLQkJCXRlc3RQcmozLmNyZWF0ZVR5cGUobW9kZWxTeW5jMywNCi0JCQkJCSJXUzMuamF2YSIsDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTNOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzMgZXh0ZW5kcyBXUzIge1xuIg0KLQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk1ldGhvZFwiKSBwdWJsaWMgdm9pZCB3ZWJNZXRob2QoaW50IHBhcmFtKSB7fVxuIg0KLQkJCQkJKyAifSIpOw0KLQkJfQ0KLQ0KLQkJaWYodGVzdFByajQ9PW51bGwpDQotCQl7DQotCQkJSVByb2plY3Qgd2ViUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZVdlYjI1UHJvamVjdCgiRE9NV1NBY3Rpb25UZXN0UHJvamVjdDQiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJCXRlc3RQcmo0ID0gbmV3IFRlc3RQcm9qZWN0KHdlYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQl0ZXN0UHJqNC5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJCW1vZGVsU3luYzQgPSB0ZXN0UHJqNC5jcmVhdGVQYWNrYWdlKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzQiKTsNCi0JCQl0ZXN0UHJqNC5jcmVhdGVUeXBlKG1vZGVsU3luYzQsDQotCQkJCQkiV1MxLmphdmEiLA0KLQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkxTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MxIHtcbiINCi0JCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJzdXBlclBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCBzdXBlclBhcmVudE1ldGhvZCgpIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQkJDQotCQkJdGVzdFByajQuY3JlYXRlVHlwZShtb2RlbFN5bmM0LA0KLQkJCQkJIldTMi5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpMk5hbWVcIikgcHVibGljIGNsYXNzIFdTMiBleHRlbmRzIFdTMSB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHBhcmVudE1ldGhvZCgpIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQkJDQotCQkJdGVzdFByajQuY3JlYXRlVHlwZShtb2RlbFN5bmM0LA0KLQkJCQkJIldTMy5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpM05hbWVcIikgcHVibGljIGNsYXNzIFdTMyBleHRlbmRzIFdTMiB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTWV0aG9kXCIpIHB1YmxpYyB2b2lkIHdlYk1ldGhvZCgpIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQl9DQotDQotCQl0YXJnZXRSZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7DQotCQl0YXJnZXRSZXNvdXJjZS5sb2FkKG51bGwpOw0KLQkJDQotCQlJdGVyYXRvcjxJV2ViU2VydmljZVByb2plY3Q+IHdzUHJvamVjdHMgPSB0YXJnZXRSZXNvdXJjZS5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5pdGVyYXRvcigpOw0KLQkJDQotCQl3aGlsZSh3c1Byb2plY3RzLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gd3NQcm9qZWN0cy5uZXh0KCk7DQotCQkJDQotCQkJaWYod3NQcm9qZWN0LmdldE5hbWUoKS5lcXVhbHModGVzdFByajEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQl0aGlzLndzUHJvamVjdDEgPSB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYod3NQcm9qZWN0LmdldE5hbWUoKS5lcXVhbHModGVzdFByajIuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQl0aGlzLndzUHJvamVjdDIgPSB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYod3NQcm9qZWN0LmdldE5hbWUoKS5lcXVhbHModGVzdFByajMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQl0aGlzLndzUHJvamVjdDMgPSB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYod3NQcm9qZWN0LmdldE5hbWUoKS5lcXVhbHModGVzdFByajQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQl0aGlzLndzUHJvamVjdDQgPSB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0MSk7DQotCQlhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0Mik7DQotCQlhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0Myk7DQotCQlhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0NCk7DQotCQkNCi0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKCkgDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoZmluYWwgSURPTSBkb20sIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsNCi0JCQkJaWYocHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHdzUHJvamVjdDEuZ2V0TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvamVjdDE7DQotCQkJCX0NCi0JCQkJZWxzZSBpZihwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMod3NQcm9qZWN0Mi5nZXROYW1lKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gd3NQcm9qZWN0MjsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh3c1Byb2plY3QzLmdldE5hbWUoKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2plY3QzOw0KLQkJCQl9DQotCQkJCWVsc2UgaWYocHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHdzUHJvamVjdDQuZ2V0TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvamVjdDQ7DQotCQkJCX0NCi0JCQkJdGhyb3cgbmV3IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcigicHJvamVjdCAiICsgcHJvamVjdCArICJub3QgZm91bmQgaW4gRE9NIik7DQotCQkJfQkJCQ0KLQkJfTsNCi0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIGdldFdTRnJvbUVqYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoSVdlYlNlcnZpY2Upd1NzWzBdOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXU0Zyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMi5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlyZXR1cm4gKElXZWJTZXJ2aWNlKXdTc1swXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTRUlFeHBGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJcmV0dXJuIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbMF07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJRnJvbVRlc3RQcmoxKFN0cmluZyBzZWlOYW1lKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWZvcihpbnQgamo9MDsgamo8c0VJcy5sZW5ndGg7IGpqKyspDQotCQkJCXsNCi0JCQkJCWlmKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2pqXSkuZ2V0TmFtZSgpLmVxdWFscyhzZWlOYW1lKSkNCi0JCQkJCXsNCi0JCQkJCQlyZXR1cm4gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tqal07DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2UgZ2V0V1NGcm9tVGVzdFByaihUZXN0UHJvamVjdCB0ZXN0UHJqLCBTdHJpbmcgd3NOYW1lKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmouZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajx3U3MubGVuZ3RoOyBqaisrKQ0KLQkJCQl7DQotCQkJCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tqal0pLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKHdzTmFtZSkpDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuIChJV2ViU2VydmljZSl3U3NbampdOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0vLwlwcm90ZWN0ZWQgSVdlYlNlcnZpY2UgZ2V0V1NGcm9tVGVzdFByajEoU3RyaW5nIHdzTmFtZSkNCi0vLwl7DQotLy8JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0vLwkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotLy8NCi0vLwkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotLy8JCXsNCi0vLwkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLS8vCQkJew0KLS8vCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotLy8JCQkJDQotLy8JCQkJZm9yKGludCBqaj0wOyBqajx3U3MubGVuZ3RoOyBqaisrKQ0KLS8vCQkJCXsNCi0vLwkJCQkJaWYoKChJV2ViU2VydmljZSl3U3NbampdKS5nZXROYW1lKCkuZXF1YWxzKHdzTmFtZSkpDQotLy8JCQkJCXsNCi0vLwkJCQkJCXJldHVybiAoSVdlYlNlcnZpY2Upd1NzW2pqXTsNCi0vLwkJCQkJfQ0KLS8vCQkJCX0NCi0vLwkJCX0NCi0vLwkJfQ0KLS8vCQkNCi0vLwkJcmV0dXJuIG51bGw7DQotLy8JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJRnJvbVRlc3RQcmozKFN0cmluZyBzZWlOYW1lKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmozLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWZvcihpbnQgamo9MDsgamo8d1NzLmxlbmd0aDsgamorKykNCi0JCQkJew0KLQkJCQkJaWYoKChJV2ViU2VydmljZSl3U3NbampdKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXROYW1lKCkuZXF1YWxzKHNlaU5hbWUpKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiAoKElXZWJTZXJ2aWNlKXdTc1tqal0pLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJRXhwRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoyLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzWzBdOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNFSUltcEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMy5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlyZXR1cm4gKChJV2ViU2VydmljZSl3U3NbMF0pLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNFSUltcEZyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJDQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmo0LmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoKElXZWJTZXJ2aWNlKXdTc1swXSkuZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0V1NNZXRob2RJbmhlcml0ZWRGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajMuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQkJT2JqZWN0W10gd1NzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod1NzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3U3MubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMy5XUzMiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoInN1cGVyUGFyZW50TWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0V1NNZXRob2RJbmhlcml0ZWRGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajQuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gd1NzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod1NzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3U3MubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jNC5XUzMiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoInN1cGVyUGFyZW50TWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0V1NNZXRob2ROb3RJbmhlcml0ZWRGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajMuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gd1NzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod1NzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3U3MubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMy5XUzMiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIndlYk1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFdTTWV0aG9kTm90SW5oZXJpdGVkRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmo0LmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCU9iamVjdFtdIHdTcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQl3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdTcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d1NzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzQuV1MzIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRTRUlNZXRob2RJbmhlcml0ZWRGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gc0VJcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHNFSXMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHNFSXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygiU2VpMk5hbWUiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoInBhcmVudE1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFNFSU1ldGhvZEluaGVyaXRlZEZyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMi5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSBzRUlzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwoc0VJcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8c0VJcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJTZWkyTmFtZSIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygicGFyZW50TWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0U0VJTWV0aG9kTm90SW5oZXJpdGVkRnJvbUVqYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCU9iamVjdFtdIHNFSXMgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChzRUlzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxzRUlzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIlNlaTJOYW1lIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRTRUlNZXRob2ROb3RJbmhlcml0ZWRGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajIuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gc0VJcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHNFSXMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHNFSXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygiU2VpMk5hbWUiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIndlYk1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGluaXRXc0FjdGlvblByb3ZpZGVyV2l0aFRyZWVTZWxlY3Rpb24oT2JqZWN0W10gc2VsZWN0aW9uKQ0KLQl7DQotCQl3c0FjdGlvblByb3YgPSBuZXcgV1NBY3Rpb25Qcm92aWRlcigpOw0KLQkJDQotCQlNb2NrPFRyZWVWaWV3ZXI+IHRyZWVWaWV3ZXIgPSBtb2NrKFRyZWVWaWV3ZXIuY2xhc3MpOw0KLQkJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBjQUV4dFNpdGUgPSBjcmVhdGVDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlTW9jayh0cmVlVmlld2VyLnByb3h5KCkpOw0KLQ0KLQkJd3NBY3Rpb25Qcm92LmluaXQoY0FFeHRTaXRlKTsNCi0JCQ0KLQkJVHJlZVBhdGggcGF0aCA9IG5ldyBUcmVlUGF0aChzZWxlY3Rpb24pOw0KLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgVHJlZVNlbGVjdGlvbihwYXRoKTsNCi0JCUFjdGlvbkNvbnRleHQgYWN0Q250ID0gbmV3IEFjdGlvbkNvbnRleHQoc2VsKTsNCi0JCQ0KLQkJd3NBY3Rpb25Qcm92LnNldENvbnRleHQoYWN0Q250KTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFdzQWN0aW9uUHJvdmlkZXJXaXRoU3RydWN0dXJlZFNlbGVjdGlvbihPYmplY3RbXSBzZWxlY3Rpb24pDQotCXsNCi0JCXdzQWN0aW9uUHJvdiA9IG5ldyBXU0FjdGlvblByb3ZpZGVyKCk7DQotDQotCQlNb2NrPFRyZWVWaWV3ZXI+IHRyZWVWaWV3ZXIgPSBtb2NrKFRyZWVWaWV3ZXIuY2xhc3MpOw0KLQkJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBjQUV4dFNpdGUgPSBjcmVhdGVDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlTW9jayh0cmVlVmlld2VyLnByb3h5KCkpOw0KLQ0KLQkJd3NBY3Rpb25Qcm92LmluaXQoY0FFeHRTaXRlKTsNCi0JCQ0KLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24pOw0KLQkJQWN0aW9uQ29udGV4dCBhY3RDbnQgPSBuZXcgQWN0aW9uQ29udGV4dChzZWwpOw0KLQkJDQotCQl3c0FjdGlvblByb3Yuc2V0Q29udGV4dChhY3RDbnQpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQ0KLQl7DQotCQlJdGVyYXRvcjxJV2ViU2VydmljZVByb2plY3Q+IHdzUHJvamVjdHMgPSB0YXJnZXRSZXNvdXJjZS5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5pdGVyYXRvcigpOw0KLQkJDQotCQl3aGlsZSh3c1Byb2plY3RzLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gd3NQcm9qZWN0cy5uZXh0KCk7DQotCQkJDQotCQkJaWYod3NQcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdzUHJvamVjdDsNCi0JCQl9DQotCQl9DQotCQl0aHJvdyBuZXcganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yKCJwcm9qZWN0ICIgKyBwcm9qZWN0ICsgIm5vdCBmb3VuZCBpbiBET00iKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIENvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgY3JlYXRlQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZU1vY2soZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpDQotCXsNCi0JCWZpbmFsIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbnRlbnRTZXJ2aWNlID0gKE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVDb250ZW50U2VydmljZSgibXl2aWV3ZXIiKTsNCi0JCQ0KLQkJLy9FY2xpcHNlIDMuNSBjb25zdHJ1Y3RvciByZXF1aXJlZCBmb3IgV1RQIGJ1aWxkDQotCQlyZXR1cm4gbmV3IENvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUoIm15ZXh0ZW5zaW9uaWQiLCAibXlwbHVnaW5pZCIsIChJQ29tbW9uVmlld2VyU2l0ZSltb2NrKElDb21tb25WaWV3ZXJTaXRlLmNsYXNzKS5wcm94eSgpLCBjb250ZW50U2VydmljZSwgdmlld2VyKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtIGNyZWF0ZUNvbnRyaWJ1dGlvbkl0ZW1Nb2NrKGZpbmFsIFN0cmluZyBpdGVtSWQpDQotCXsNCi0JCU1vY2s8SUNvbnRyaWJ1dGlvbkl0ZW0+IGNudHJiSXRlbSA9IG1vY2soSUNvbnRyaWJ1dGlvbkl0ZW0uY2xhc3MpOw0KLQkJY250cmJJdGVtLnN0dWJzKCkubWV0aG9kKCJnZXRJZCIpLndpbGwocmV0dXJuVmFsdWUoaXRlbUlkKSk7DQotCQljbnRyYkl0ZW0uc3R1YnMoKS5tZXRob2QoInNldFBhcmVudCIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJY250cmJJdGVtLnN0dWJzKCkubWV0aG9kKCJpc0R5bmFtaWMiKS53aWxsKHJldHVyblZhbHVlKGZhbHNlKSk7DQotCQlyZXR1cm4gY250cmJJdGVtLnByb3h5KCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGZpbGxNZW51V2l0aENvbnRyaWJ1dGlvbkl0ZW1zKGZpbmFsIE1lbnVNYW5hZ2VyIG1lbnUsIGZpbmFsIFN0cmluZy4uLiBpdGVtSWRzKQ0KLQl7DQotCQlmb3IoU3RyaW5nIGlkIDogaXRlbUlkcykNCi0JCXsNCi0JCQlJQ29udHJpYnV0aW9uSXRlbSBjbnRyYkl0ZW0gPSBjcmVhdGVDb250cmlidXRpb25JdGVtTW9jayhpZCk7DQotCQkJbWVudS5hZGQoY250cmJJdGVtKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjMjQxYTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTA0ODRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gSnVsIDIwIDE1OjI1OjMxIEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYjU2MDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjANCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQ0KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXINCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscywNCi0gb3JnLmptb2NrLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwNCi0gb3JnLmVjbGlwc2UudWksDQotIG9yZy5lY2xpcHNlLnVpLmlkZSwNCi0gb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24sDQotIG9yZy5qdW5pdA0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5hbm5vdGF0aW9ucywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmFubm90YXRpb24uaW1wbCwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5kZWZhdWx0cywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udXRpbCwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMudmFsaWRhdGlvbg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjdhY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FhZTI0OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjlmYTA1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPURPTSBSdW50aW1lIFRlc3RzIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2OTNiN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4NCi08IS0tDQotICAgIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICANCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIC0tPg0KLQ0KLTxmcmFnbWVudD4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InN1cHBvcnRlZHJ1bnRpbWV0ZXN0Ig0KLSAgICAgICAgIG5hbWU9IlRlc3RpbmciDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5kb21ydW50aW1lcyI+DQotICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLlRlc3RXc0RPTVJ1bnRpbWVFeHRlbnNpb24iLz4NCi0gICAgICA8cHJvamVjdF9mYWNldCANCi0gICAgICAJIGlkPSJqc3Qud2ViIg0KLSAgICAgIAkgdmVyc2lvbj0iMS4wLjAuMCIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9InRlc3QuZmFjZXQiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSINCi0gICAgICAgICBuYW1lPSJUZXN0aW5nMSINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmRvbXJ1bnRpbWVzIj4NCi0gICAgICA8aW1wbGVtZW50YXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20uVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbiIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9ImpzdC53ZWJiIg0KLSAgICAgIAkgdmVyc2lvbj0iMS4wLjAuMCIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9InRlc3QuZmFjZXR0Ii8+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJzdXBwb3J0ZWRydW50aW1ldGVzdDIiDQotICAgICAgICAgbmFtZT0iVGVzdGluZzIiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5kb21ydW50aW1lcyI+DQotICAgICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLldzRE9NUnVudGltZVJlZ2lzdHJ5VGVzdCIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9ImpzdC53ZWJiIg0KLSAgICAgIAkgdmVyc2lvbj0iMS4wLjAuMCIvPg0KLSAgICAgIDxwcm9qZWN0X2ZhY2V0IA0KLSAgICAgIAkgaWQ9InRlc3QuZmFjZXR0Ii8+DQotICAgPC9leHRlbnNpb24+DQotPC9mcmFnbWVudD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwN2UzZGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zLkFubm90YXRpb25zVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zLkFycmF5VmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zLkNvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5hbm5vdGF0aW9ucy5QYXJhbVZhbHVlUGFpckltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnMuUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20uTG9jYXRvckV4dHJhY3RvclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20uV3NET01SdW50aW1lTWFuYWdlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20uV3NET01SdW50aW1lUmVnaXN0cnlUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlVGVzdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvblRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuUHJvamVjdEFkZGluZ1Rlc3RzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLldvcmtzcGFjZUNVRmluZGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLkFubm90YXRpb25BZGFwdGVyRmFjdG9yeVRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsLkFubm90YXRpb25BZGFwdGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuZGVmYXVsdHMuUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzLlNlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLkFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuTWV0aG9kU2VyaWFsaXplckFkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuU2VpU2VyaWFsaXplckFkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLldzU2VyaWFsaXplckFkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlLk1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZS5QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3RhdGUuUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZS5TZWlQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3RhdGUuV3NQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYy5BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLkltcGxpY2l0U2VpTWV0aG9kU3luY2hyb25pemF0aW9uVGVzdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYy5NZXRob2RQYXJhbXNTeW5jaHJvbml6YXRpb25UZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jLk1vZGVsU3luY2hyb25pemF0aW9uVGVzdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYy5PbkV2ZW50TW9kZWxTeW5jcm9uaXplclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYy5TZWlNZXRob2RTeW5jcm9uaXphdGlvblRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYy5TZWlTeW5jcm9uaXphdGlvblRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYy5Xc1N5bmNocm9uaXphdGlvblRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udXRpbC5Eb20yUmVzb3VyY2VNYXBwZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnV0aWwuRG9tVXRpbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uLkNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3JUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb24uRG9tVmFsaWRhdG9yRmFjdG9yeVRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbi5FbmRwb2ludElzU2Vzc2lvbkJlYW5Db25zdHJhaW50VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uLkpheFdzRG9tVmFsaWRhdG9yVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uLlNlaVZhbGlkYXRpb25UZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb24uV21WYWxpZGF0aW9uVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uLldwVmFsaWRhdGlvblRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbi5Xc1ZhbGlkYXRpb25UZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMudmFsaWRhdGlvbi5NZXRob2RWYWxpZGF0b3JUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMudmFsaWRhdGlvbi5SdW50aW1lVHlwZVZhbGlkYXRvclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy52YWxpZGF0aW9uLlNlaVZhbGlkYXRvclRlc3Q7DQotDQotcHVibGljIGNsYXNzIEFsbFRlc3RzU3VpdGUNCi17DQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotCXsNCi0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0NCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSdW50aW1lVHlwZVZhbGlkYXRvclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZFZhbGlkYXRvclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25GYWN0b3J5VGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvbnNUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQYXJhbVZhbHVlUGFpckltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShRdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTZWlWYWxpZGF0b3JUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXc0RPTVJ1bnRpbWVSZWdpc3RyeVRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdzRE9NUnVudGltZU1hbmFnZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb21WYWxpZGF0b3JGYWN0b3J5VGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRG9tMlJlc291cmNlTWFwcGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRG9tVXRpbFRlc3QuY2xhc3MpOw0KLQkJDQotCQkvLyBET00gdGVzdHMNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZVRlc3RzLmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9qZWN0QWRkaW5nVGVzdHMuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdvcmtzcGFjZUNVRmluZGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTG9jYXRvckV4dHJhY3RvclRlc3QuY2xhc3MpOw0KLQkJLy8gRE9NIHN5bmMgdGVzdHMNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT25FdmVudE1vZGVsU3luY3Jvbml6ZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbXBsaWNpdFNlaU1ldGhvZFN5bmNocm9uaXphdGlvblRlc3RzLmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RQYXJhbXNTeW5jaHJvbml6YXRpb25UZXN0cy5jbGFzcyk7CQkNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNb2RlbFN5bmNocm9uaXphdGlvblRlc3RzLmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTZWlNZXRob2RTeW5jcm9uaXphdGlvblRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlaVN5bmNyb25pemF0aW9uVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoV3NTeW5jaHJvbml6YXRpb25UZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvclRlc3QuY2xhc3MpOw0KLQkJLy8gc3RhdGUgYWRhcHRlcnMgdGVzdHMNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeVRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlaVByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoV3NQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5jbGFzcyk7DQotCQkvLyBzZXJpYWxpemUgYWRhcHRlciB0ZXN0cw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RTZXJpYWxpemVyQWRhcHRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlaVNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5VGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoV3NTZXJpYWxpemVyQWRhcHRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5jbGFzcyk7DQotCQkvLyBkZWZhdWx0IHZhbHVlcyBhZGFwdGVyIHRlc3RzDQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuY2xhc3MpOw0KLQkJLy8gb3RoZXIgYWRhcHRlcnMgdGVzdHMNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uQWRhcHRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25BZGFwdGVyRmFjdG9yeVRlc3QuY2xhc3MpOw0KLQkJLy8gdmFsaWRhdGlvbiB0ZXN0cw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnRUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3JUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXhXc0RvbVZhbGlkYXRvclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlaVZhbGlkYXRpb25UZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXc1ZhbGlkYXRpb25UZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXbVZhbGlkYXRpb25UZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXcFZhbGlkYXRpb25UZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbmRwb2ludElzU2Vzc2lvbkJlYW5Db25zdHJhaW50VGVzdC5jbGFzcyk7DQotCQkNCi0JCS8vc3VpdGUuYWRkVGVzdFN1aXRlKENBRldzZGxUZXN0cy5jbGFzcyk7DQotCQkNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWRUZXN0LmNsYXNzKTsNCi0NCi0JCXJldHVybiBzdWl0ZTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOWFmZTdjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi0vKioNCi0gKiBBbm5vdGF0aW9uRmFjdG9yeSBjbGFzcyB0ZXN0IGNhc2VzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikNCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZhY3RvcnlUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3RyaW5nVmFsdWUoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHN0clZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlhc3NlcnROb3ROdWxsKHN0clZhbHVlKTsNCi0JCWFzc2VydFRydWUoc3RyVmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoInZhbHVlIikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQYXJhbVZhbHVlUGFpcigpDQotCXsNCi0JCUlWYWx1ZSBzdHJWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShudWxsLCBzdHJWYWx1ZSk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIiIsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJfQ0KLQ0KLQkJSVBhcmFtVmFsdWVQYWlyIHZhbHVlUGFpciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3RyVmFsdWUpOw0KLQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZVBhaXIpOw0KLQkJYXNzZXJ0VHJ1ZSh2YWx1ZVBhaXIuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIElWYWx1ZSk7DQotCQlhc3NlcnRUcnVlKHZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygicGFyYW0iKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBsZXhBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlJVmFsdWUgc3RyVmFsdWUxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3RyVmFsdWUxKTsNCi0NCi0JCUlWYWx1ZSBzdHJWYWx1ZTIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUxIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgdmFsdWVQYWlyMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtMSIsIHN0clZhbHVlMik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZCh2YWx1ZVBhaXIxKTsNCi0JCXBhcmFtVmFsdWVzLmFkZCh2YWx1ZVBhaXIyKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24obnVsbCwgcGFyYW1WYWx1ZXMsZW5kcG9pbnQpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCIiLCBudWxsLCBlbmRwb2ludCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gY2EgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJuYW1lIiwgcGFyYW1WYWx1ZXMsZW5kcG9pbnQpOw0KLQkJYXNzZXJ0Tm90TnVsbChjYSk7DQotCQlhc3NlcnRFcXVhbHMoY2EuZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpLCAyKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVmFsdWVQYWlyKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiIiwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUobnVsbCwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQXJyYXlWYWx1ZSgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFycmF5VmFsdWUobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCUlWYWx1ZSBzdHJWYWx1ZTEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUxIik7DQotCQlJVmFsdWUgc3RyVmFsdWUyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlMiIpOw0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzLmFkZChzdHJWYWx1ZTEpOw0KLQkJdmFsdWVzLmFkZChzdHJWYWx1ZTIpOw0KLQkJDQotCQkNCi0JCUlWYWx1ZSBhcnJWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFycmF5VmFsdWUodmFsdWVzKTsNCi0JCWFzc2VydE5vdE51bGwoYXJyVmFsdWUpOw0KLQkJYXNzZXJ0VHJ1ZShhcnJWYWx1ZS50b1N0cmluZygpLmVxdWFscygiW3ZhbHVlMSwgdmFsdWUyXSIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQlJVmFsdWUgcU5hbWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoIm9yZy5lY2xpcHNlLmRlbW8uVGVzdCIpOw0KLQkJYXNzZXJ0Tm90TnVsbChxTmFtZSk7DQotCQlhc3NlcnRUcnVlKHFOYW1lLnRvU3RyaW5nKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5kZW1vLlRlc3QiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUJvb2xlYW5WYWx1ZSgpDQotCXsNCi0JCUlWYWx1ZSBib29sVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUodHJ1ZSk7DQotCQlhc3NlcnROb3ROdWxsKGJvb2xWYWx1ZSk7DQotCQlhc3NlcnRFcXVhbHMoYm9vbFZhbHVlLnRvU3RyaW5nKCksICJ0cnVlIik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25zRnJvbUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotCX0NCi0NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotLy8Jew0KLS8vCQlwcmVwYXJlUHJvamVjdCgpOw0KLS8vDQotLy8JCUlGaWVsZCBmaWVsZCA9IGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChmaWVsZCk7DQotLy8NCi0vLwkJSUFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXR0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCkgZ2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoZmllbGQpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0vLwkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5sZW5ndGggPT0gMSk7DQotLy8JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbnNGcm9tTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTs7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuIGluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lUeXBlU2V0T2ZTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlTZXQ8U3RyaW5nPiB0b1JlbW92ZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCXRvUmVtb3ZlLmFkZCgiV2ViU2VydmljZSIpOw0KLQkJdG9SZW1vdmUuYWRkKCJXZWJNZXRob2QiKTsNCi0NCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zKGVuZHBvaW50LCB0b1JlbW92ZSk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTWV0aG9kID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc01ldGhvZC5zaXplKCkgPT0gMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJSUZpZWxkIGZpZWxkID0gZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChmaWVsZCk7DQotDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChmaWVsZCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTWV0aG9kID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc01ldGhvZC5zaXplKCkgPT0gMSk7DQotDQotLy8JCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuZ2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoZmllbGQpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0vLwkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5sZW5ndGggPT0gMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChtZXRob2QpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTWV0aG9kLnNpemUoKT09IDApOw0KLQ0KLS8vCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUZpZWxkKGZpZWxkKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotLy8JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMubGVuZ3RoID09IDApOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwcmVwYXJlUHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbnNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTkzZTMzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleEFubm90YXRpb25RTlZhbHVlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCUlQYXJhbVZhbHVlUGFpciBwdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQocHYpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViU2VydmljZSIsIHBhcmFtVmFsdWVzLCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgZW5kcG9pbnQpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpLnNpemUoKSA+IDApOw0KLQl9DQotDQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uQXJyYXlWYWx1ZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU2luZ2xlRWxlbWVudEFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgbmV3IFN0cmluZ1tdIHsgInZhbDEiLCAidmFsMiIgfSk7DQotLy8JCWFubm90YXRpb24uYWRkVG9DbGFzcyhlbmRwb2ludCk7DQotLy8NCi0vLwkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uRmFjdG9yeS5nZXRBbm5vdGF0aW9uc0Zyb21DbGFzcyhlbmRwb2ludCkubGVuZ3RoID4gMCk7DQotLy8JfQ0KLS8vDQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNpbXBsZUFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU2ltcGxlQW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiKTsNCi0vLwkJYW5ub3RhdGlvbi5hZGRUb0NsYXNzKGVuZHBvaW50KTsNCi0vLw0KLS8vCQlhc3NlcnRUcnVlKEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUNsYXNzKGVuZHBvaW50KS5sZW5ndGggPiAwKTsNCi0vLwl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBjbGFzcy4gVGhlIGFubm90YXRpb24gaGFzIHRoZSBmb3JtOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogCSBAV2ViU2VydmljZShzZXJ2aWNlTmFtZT0mcXVvdDtzZXJ2aWNlTmFtZSZxdW90OywNCi0JICogCSBuYW1lPSZxdW90O3BvcnRUeXBlTmFtZSZxdW90OywNCi0JICogCSB0YXJnZXROYW1lc3BhY2U9JnF1b3Q7aHR0cDovL2RlbW8uc2FwLmNvbS8mcXVvdDssDQotCSAqIAkgd3NkbExvY2F0aW9uPSZxdW90O2h0dHA6Ly93c2RsL3VybC8mcXVvdDssDQotCSAqIAkgcG9ydE5hbWU9JnF1b3Q7cG9ydE5hbWUmcXVvdDssDQotCSAqIAkgZW5kcG9pbnRJbnRlcmZhY2U9JnF1b3Q7b3JnLmVjbGlwc2UuZGVtby5JU2VpJnF1b3Q7KQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhDbGFzc0Fubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQ0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJzZXJ2aWNlTmFtZSIsICJzZXJ2aWNlTmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJuYW1lIiwgInBvcnRUeXBlTmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2RlbW8uc2FwLmNvbS8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAid3NkbExvY2F0aW9uIiwgImh0dHA6Ly93c2RsL3VybC8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAicG9ydE5hbWUiLCAicG9ydE5hbWUiKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAiZW5kcG9pbnRJbnRlcmZhY2UiLCAib3JnLmVjbGlwc2UuZGVtby5JU2VpIik7DQotDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCBlbmRwb2ludCk7DQotDQotCQlBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCBhbm5vdGF0aW9uSW5zcGVjdG9yID0gbmV3IEFubm90YXRpb25JbnNwZWN0b3JJbXBsKGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiB0eXBlQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uSW5zcGVjdG9yLmluc3BlY3RUeXBlKCk7DQotCQkgCQkNCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlPiB0eXBlQW5ub3RhdGlvbiA6IHR5cGVBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlpZih0eXBlQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiV2ViU2VydmljZSIpIHx8IHR5cGVBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJqYXZheC5qd3MuV2ViU2VydmljZSIpKQ0KLQkJCXsNCi0JCQkJaWYodHlwZUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpICE9IDYpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzZXJ2aWNlTmFtZSIpLmVxdWFscygic2VydmljZU5hbWUiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKS5lcXVhbHMoInBvcnRUeXBlTmFtZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidGFyZ2V0TmFtZXNwYWNlIikuZXF1YWxzKCJodHRwOi8vZGVtby5zYXAuY29tLyIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgid3NkbExvY2F0aW9uIikuZXF1YWxzKCJodHRwOi8vd3NkbC91cmwvIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwb3J0TmFtZSIpLmVxdWFscygicG9ydE5hbWUiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImVuZHBvaW50SW50ZXJmYWNlIikuZXF1YWxzKCJvcmcuZWNsaXBzZS5kZW1vLklTZWkiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0NCi0JCQkJcmVzdWx0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnRUcnVlKCJDbGFzcyBpcyBub3QgYW5ub3RhdGVkIGNvcnJlY3RseSIsIHJlc3VsdCk7DQotCQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBtZXRob2QgZGVjbGFyYXRpb24uIEFubm90YXRpb24gaGFzIHRoZSBmb3JtOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogIFxAV2ViTWV0aG9kKGV4Y2x1ZGU9ZmFsc2Usb3BlcmF0aW9uTmFtZT0mcXVvdDthbm5vdGF0ZWRNZXRob2QmcXVvdDssYWN0aW9uPSZxdW90O2dvJnF1b3Q7KQkNCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb21wbGV4TWV0aG9kQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQlJVmFsdWUgZW1WYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZShmYWxzZSk7DQotCQlwYXJhbVZhbHVlcy5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiZXhjbHVkZSIsIGVtVmFsdWUpKTsNCi0NCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAib3BlcmF0aW9uTmFtZSIsICJhbm5vdGF0ZWRNZXRob2QiKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAiYWN0aW9uIiwgImdvIik7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCQkJDQotCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYk1ldGhvZCIsIHBhcmFtVmFsdWVzLCBtZXRob2QpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIG1ldGhvZCk7DQotDQotCQlBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCBhbm5vdGF0aW9uSW5zcGVjdG9yID0gbmV3IEFubm90YXRpb25JbnNwZWN0b3JJbXBsKGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IG1ldGhvZEFubm90YXRpb25zID0gYW5ub3RhdGlvbkluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkgCQkNCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotCQlmb3IgKElBbm5vdGF0aW9uPElNZXRob2Q+IG1ldGhvZEFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlpZihtZXRob2RBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJqYXZheC5qd3MuV2ViTWV0aG9kIikgfHwgbWV0aG9kQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiV2ViTWV0aG9kIikpDQotCQkJew0KLQkJCQlpZihtZXRob2RBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSAhPSAzKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighbWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJleGNsdWRlIikuZXF1YWxzKCJmYWxzZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighbWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJvcGVyYXRpb25OYW1lIikuZXF1YWxzKCJhbm5vdGF0ZWRNZXRob2QiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIW1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYWN0aW9uIikuZXF1YWxzKCJnbyIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJIAkJCQkNCi0JCQkJcmVzdWx0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnRUcnVlKCJNZXRob2QgaXMgbm90IGFubm90YXRlZCBjb3JyZWN0bHkiLCByZXN1bHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBhIG1ldGhvZCBwYXJhbWV0ZXIuIFRoZSBhbm5vdGF0aW9uIGhhcyB0aGUgZm9ybToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICBcQFdlYlBhcmFtKG9wZXJhdGlvbk5hbWU9JnF1b3Q7YW5ub3RhdGVkUGFyYW0mcXVvdDssIHRhcmdldE5hbWVzcGFjZT0mcXVvdDtodHRwOi8vZGVtby5zYXAuY29tL3BhcmFtcy8mcXVvdDssIHBhcnROYW1lPSZxdW90O3BhcnROYW1lJnF1b3Q7KQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhQYXJhbUFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKCJhbm5vdGF0ZWRQYXJhbSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgImFubm90YXRlZFBhcmFtIiwgInBhcmFtIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZGVtby5zYXAuY29tL3BhcmFtcy8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAicGFydE5hbWUiLCAicGFydE5hbWUiKTsNCi0NCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYlBhcmFtIiwgcGFyYW1WYWx1ZXMsIHR5cGVQYXJhbWV0ZXIpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIHR5cGVQYXJhbWV0ZXIpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhZGRTdHJpbmdQcm9wZXJ0eShTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcywgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdmFsdWUpDQotCXsNCi0JCUlWYWx1ZSBwVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSh2YWx1ZSk7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcGFpciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUocHJvcGVydHksIHBWYWx1ZSk7DQotCQlwYXJhbVZhbHVlcy5hZGQocGFpcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvQXJyYXlWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmUyZTIwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5BcnJheVZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuU3RyaW5nVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBBcnJheVZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMSA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczEuY2xlYXIoKTsNCi0JCXZhbHVlczEuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjEgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMSk7DQotCQkNCi0JCVNldDxJVmFsdWU+IHZhbHVlczIgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMyLmNsZWFyKCk7DQotCQl2YWx1ZXMyLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwyIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYyID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczIpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhdjEuaGFzaENvZGUoKSAhPSBhdjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEFycmF5VmFsdWVJbXBsKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJbmV3IEFycmF5VmFsdWVJbXBsKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMSA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczEuY2xlYXIoKTsNCi0JCXZhbHVlczEuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjEgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMSk7DQotDQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMyID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMi5jbGVhcigpOw0KLQkJdmFsdWVzMi5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMiIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MiA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMyKTsNCi0NCi0JCVNldDxJVmFsdWU+IHZhbHVlczMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMzLmNsZWFyKCk7DQotCQl2YWx1ZXMzLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwxIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYzID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczMpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYXYxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhdjEuZXF1YWxzKDEyMykpOw0KLQkJYXNzZXJ0RmFsc2UoYXYxLmVxdWFscyhhdjIpKTsNCi0NCi0JCWFzc2VydFRydWUoYXYxLmVxdWFscyhhdjMpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Db21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9Db21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4NjY1ZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvQ29tcGxleEFubm90YXRpb25JbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIENvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17CQ0KLQlwcml2YXRlIE1vY2s8SVR5cGU+IHR5cGVFbGVtZW50ID0gbW9jayhJVHlwZS5jbGFzcyk7DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwdnAgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHZhbHVlKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHB2cCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZSIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lMiIsIHBhcmFtVmFsdWVzLHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uMS5oYXNoQ29kZSgpICE9IGFubm90YXRpb24yLmhhc2hDb2RlKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwdnAgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHZhbHVlKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHB2cCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZSIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lMiIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbjEuZXF1YWxzKGFubm90YXRpb24yKSk7DQotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uMS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbjEuZXF1YWxzKDEyMykpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uMS5lcXVhbHMoYW5ub3RhdGlvbjMpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9FbmRwb2ludC5zcmMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9FbmRwb2ludC5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5YzdhNDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvRW5kcG9pbnQuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJXU0ltcGxCZWFuU2VydmljZSIsIG5hbWU9IldTSW1wbEJlYW4iLCB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZW1vL3NhcC9jb20vIiwgcG9ydE5hbWU9IldTSW1wbEJlYW5Qb3J0IikNCi1AU3RhdGVsZXNzDQotcHVibGljIGNsYXNzIEVuZHBvaW50DQotew0KLQlATXlBbm5vdGF0aW9uKG5hbWU9ImZpZWxkMSIpDQotCXB1YmxpYyBTdHJpbmcgZmllbGQxOw0KLQkNCi0JQFdlYk1ldGhvZChleGNsdWRlPWZhbHNlLG9wZXJhdGlvbk5hbWU9InRlc3QiKQ0KLQlwdWJsaWMgdm9pZCBhbm5vdGF0ZWRNZXRob2QoIEBXZWJQYXJhbShuYW1lPSJhbm5vdGF0ZWRQYXJhbSIpIFN0cmluZyBhbm5vdGF0ZWRQYXJhbSkgDQotCXsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9QYXJhbVZhbHVlUGFpckltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9QYXJhbVZhbHVlUGFpckltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1NjdlZjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvYW5ub3RhdGlvbnMvUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuUGFyYW1WYWx1ZVBhaXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5TdHJpbmdWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVQYWlySW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJSVZhbHVlIHZhbHVlID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbSIsIHZhbHVlKTsNCi0NCi0JCUlWYWx1ZSB2YWx1ZTEgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZTEiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAxID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0xIiwgdmFsdWUxKTsNCi0NCi0JCWFzc2VydEZhbHNlKHB2cC5oYXNoQ29kZSgpID09IHB2cDEuaGFzaENvZGUoKSk7DQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMoMTIzKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0iLCB2YWx1ZSk7DQotDQotCQlJVmFsdWUgdmFsdWUxID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAxID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0iLCB2YWx1ZTEpOw0KLQ0KLQkJSVZhbHVlIHZhbHVlMiA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlMiIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cDIgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbTIiLCB2YWx1ZTIpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShwdnAuZXF1YWxzKHB2cDEpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMocHZwMikpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL1F1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9hbm5vdGF0aW9ucy9RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzY3MzQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2Fubm90YXRpb25zL1F1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIFF1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpDQotCXsNCi0JCUlWYWx1ZSBxdjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUxIik7DQotCQlJVmFsdWUgcXYyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlhc3NlcnRGYWxzZShxdjEuaGFzaENvZGUoKSA9PSBxdjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQkJSVZhbHVlIHF2MSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZTEiKTsNCi0JCUlWYWx1ZSBxdjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCWFzc2VydEZhbHNlKHF2LmVxdWFscyhxdjEpKTsNCi0JCWFzc2VydFRydWUocXYuZXF1YWxzKHF2MikpOw0KLQkJYXNzZXJ0RmFsc2UocXYuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHF2LmVxdWFscygxMjMpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vTG9jYXRvckV4dHJhY3RvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Mb2NhdG9yRXh0cmFjdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NDM2MmZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Mb2NhdG9yRXh0cmFjdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuTG9jYXRvckV4dHJhY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBMb2NhdG9yRXh0cmFjdG9yfQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYXRvckV4dHJhY3RvclRlc3QgIGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByb2plY3Q7DQotCXByaXZhdGUgSVR5cGUgd3NUeXBlOw0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzOw0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRlc3RQcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQkNCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IHRlc3RQcm9qZWN0LmNyZWF0ZVBhY2thZ2UoInRlc3QubG9jYXRvci5leHRyYWN0b3IiKTsNCi0JCXdzVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUocGFjaywgIldzLmphdmEiLCAicHVibGljIGNsYXNzIFdzIHtcbiIgKw0KLQkJCQkiCXB1YmxpYyB2b2lkIHRlc3QoKSB7fVxuICIgKw0KLQkJCQkifSIpOwkJDQotCQkNCi0JCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZVByb2plY3QoKTsNCi0JCXdzUHJvamVjdC5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUsIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJDQotCQl3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQl3cy5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIHdzVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotDQotCQl3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKS5hZGQod3MpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kRm9yV3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbg0KLQl7DQotCQlJTG9jYXRvciBsb2NhdG9yID0gTG9jYXRvckV4dHJhY3Rvci5nZXRJbnN0YW5jZSgpLmZpbmQod3MpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoMywgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDQ2LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoMiwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL1Rlc3RXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9UZXN0V3NET01SdW50aW1lRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3NzUxZmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL1Rlc3RXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NEb21Mb2FkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuam1vY2suTW9jazsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbiBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSBpbXBsZW1lbnRzIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gDQotew0KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOw0KLQkNCi0JcHVibGljIHZvaWQgY3JlYXRlRE9NKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgDQotCXsNCi0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7DQotCX0NCi0JDQotCXB1YmxpYyBJRE9NIGdldERPTSgpDQotCXsNCi0JCU1vY2sgaXRlciA9IG5ldyBNb2NrKEl0ZXJhdG9yLmNsYXNzKTsNCi0JCWl0ZXIuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImhhc05leHQiKS53aWxsKHJldHVyblZhbHVlKGZhbHNlKSk7DQotCQkoKEl0ZXJhdG9yPD8+KWl0ZXIucHJveHkoKSkuaGFzTmV4dCgpOw0KLQkJTW9jayBlTGlzdCA9IG5ldyBNb2NrKEVMaXN0LmNsYXNzKTsNCi0JCWVMaXN0LmV4cGVjdHMoYXRMZWFzdE9uY2UoKSkubWV0aG9kKCJpdGVyYXRvciIpLndpbGwocmV0dXJuVmFsdWUoaXRlci5wcm94eSgpKSk7DQotCQkoKEVMaXN0PD8+KWVMaXN0LnByb3h5KCkpLml0ZXJhdG9yKCk7DQotCQlNb2NrIGRvbSA9IG5ldyBNb2NrKElET00uY2xhc3MpOw0KLQkJZG9tLmV4cGVjdHMoYXRMZWFzdE9uY2UoKSkubWV0aG9kKCJnZXRXZWJTZXJ2aWNlUHJvamVjdHMiKS53aWxsKHJldHVyblZhbHVlKGVMaXN0LnByb3h5KCkpKTsNCi0JCSgoSURPTSlkb20ucHJveHkoKSkuZ2V0V2ViU2VydmljZVByb2plY3RzKCk7DQotCQlyZXR1cm4gKElET00pZG9tLnByb3h5KCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHJlbW92ZUxvYWRMaXN0ZW5lcihJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDYW5jZWxlZCgpIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vV3NET01SdW50aW1lTWFuYWdlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTRjMGQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuSVdzRE9NUnVudGltZUluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5Xc0RPTVJ1bnRpbWVSZWdpc3RyeTsNCi0NCi1wdWJsaWMgY2xhc3MgV3NET01SdW50aW1lTWFuYWdlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBXc0RPTVJ1bnRpbWVNYW5hZ2VyIHRhcmdldDsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIA0KLQl7DQotCQl0YXJnZXQgPSAoV3NET01SdW50aW1lTWFuYWdlcilXc0RPTVJ1bnRpbWVNYW5hZ2VyLmluc3RhbmNlKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRET01SdW50aW1lRm9yUnVudGltZUluZm8oKQ0KLQl7DQotCQlDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVJbmZvPiByZWdpc3RlcmVkUnVudGltZXMgPSBXc0RPTVJ1bnRpbWVSZWdpc3RyeS5nZXRSZWdpc3RlcmVkUnVudGltZXNJbmZvKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwodGFyZ2V0LmdldERPTVJ1bnRpbWUocmVnaXN0ZXJlZFJ1bnRpbWVzLml0ZXJhdG9yKCkubmV4dCgpKSk7DQotCQkNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZSA9IHRhcmdldC5nZXRET01SdW50aW1lKHJlZ2lzdGVyZWRSdW50aW1lcy5pdGVyYXRvcigpLm5leHQoKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscyhydW50aW1lLCB0YXJnZXQuZ2V0RE9NUnVudGltZShyZWdpc3RlcmVkUnVudGltZXMuaXRlcmF0b3IoKS5uZXh0KCkpKTsNCi0JCQ0KLQkJcmVnaXN0ZXJlZFJ1bnRpbWVzID0gV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMocnVudGltZSwgdGFyZ2V0LmdldERPTVJ1bnRpbWUocmVnaXN0ZXJlZFJ1bnRpbWVzLml0ZXJhdG9yKCkubmV4dCgpKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldERPTVJ1bnRpbWVGb3JSdW50aW1lSWQoKQ0KLQl7DQotCQlhc3NlcnROb3ROdWxsKHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdCIpKTsNCi0JCWFzc2VydE51bGwodGFyZ2V0LmdldERPTVJ1bnRpbWUoInRlc3QuaWQiKSk7DQotCQlhc3NlcnRFcXVhbHModGFyZ2V0LmdldERPTVJ1bnRpbWUoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0IiksIHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdCIpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZURPTVJ1bnRpbWVzKCkNCi0Jew0KLQkJdGFyZ2V0LmNyZWF0ZURPTVJ1bnRpbWVzKG51bGwpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdCIpKTsNCi0JCWFzc2VydE5vdE51bGwodGFyZ2V0LmdldERPTVJ1bnRpbWUoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSIpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEVhcmx5U3RhcnR1cCgpDQotCXsNCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZFbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjb25mRWxlbWVudHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuV3NEb21TdGFydHVwUGFydGljaXBhbnQiLmVxdWFscyhjb25mRWxlbWVudHNbaWldLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlmYWlsKCJUaGUgZWFybHkgc3RhcnR1cCBmb3IgRE9NIE1vZGVsIGlzIG5vdCBkZWZpbmVkICEiKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFJlbG9hZERPTVJ1bnRpbWVzKCkNCi0Jew0KLQkJdGFyZ2V0LnJlbG9hZERPTVJ1bnRpbWVzKG51bGwpOw0KLQkJDQotCQlJV3NET01SdW50aW1lRXh0ZW5zaW9uIGRvbVJ1bnRpbWUgPSB0YXJnZXQuZ2V0RE9NUnVudGltZSgic3VwcG9ydGVkcnVudGltZXRlc3QiKTsNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZTEgPSB0YXJnZXQuZ2V0RE9NUnVudGltZSgic3VwcG9ydGVkcnVudGltZXRlc3QxIik7DQotCQkJDQotCQl0YXJnZXQucmVsb2FkRE9NUnVudGltZXMobnVsbCk7DQotCQkNCi0JCWFzc2VydE5vdFNhbWUoZG9tUnVudGltZSx0YXJnZXQuZ2V0RE9NUnVudGltZShXc0RPTVJ1bnRpbWVSZWdpc3RyeS5nZXRSdW50aW1lSW5mbygic3VwcG9ydGVkcnVudGltZXRlc3QiKS5nZXRJZCgpKSk7DQotCQlhc3NlcnROb3RTYW1lKGRvbVJ1bnRpbWUxLHRhcmdldC5nZXRET01SdW50aW1lKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKCJzdXBwb3J0ZWRydW50aW1ldGVzdDEiKS5nZXRJZCgpKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRET01SdW50aW1lcygpDQotCXsNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IHRhcmdldC5nZXRET01SdW50aW1lKCJzdXBwb3J0ZWRydW50aW1ldGVzdCIpOwkJDQotCQlhc3NlcnROb3ROdWxsKGRvbVJ1bnRpbWUpOw0KLQkJYXNzZXJ0VHJ1ZShkb21SdW50aW1lIGluc3RhbmNlb2YgVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbik7DQotCQkNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZTEgPSB0YXJnZXQuZ2V0RE9NUnVudGltZSgic3VwcG9ydGVkcnVudGltZXRlc3QxIik7CQkNCi0JCWFzc2VydE5vdE51bGwoZG9tUnVudGltZTEpOw0KLQkJYXNzZXJ0VHJ1ZShkb21SdW50aW1lMSBpbnN0YW5jZW9mIFRlc3RXc0RPTVJ1bnRpbWVFeHRlbnNpb24pOwkJDQotCQkNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZTIgPSB0YXJnZXQuZ2V0RE9NUnVudGltZSgic3VwcG9ydGVkcnVudGltZXRlc3QyIik7DQotCQlhc3NlcnROdWxsKGRvbVJ1bnRpbWUyKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZURPTVBhc3Nlc1Byb2dyZXNzTW9uaXRvcigpDQotCXsNCi0JCU15V3NEb21SdW50aW1lTWFuYWdlciBtYW5hZ2VyID0gbmV3IE15V3NEb21SdW50aW1lTWFuYWdlcigpOw0KLQkJSVdzRE9NUnVudGltZUluZm8gaW5mbyA9IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKCJzdXBwb3J0ZWRydW50aW1ldGVzdDEiKTsNCi0JCU51bGxQcm9ncmVzc01vbml0b3IgbnBtID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0JCUlXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnRFeCA9IG1hbmFnZXIuY3JlYXRlRE9NUnVudGltZShpbmZvLCBucG0pOw0KLQkJYXNzZXJ0VHJ1ZShydEV4IGluc3RhbmNlb2YgVGVzdFdzRE9NUnVudGltZUV4dGVuc2lvbik7DQotCQlhc3NlcnRFcXVhbHMobnBtLCAoKFRlc3RXc0RPTVJ1bnRpbWVFeHRlbnNpb24pcnRFeCkubW9uaXRvcik7CQkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBjbGFzcyBNeVdzRG9tUnVudGltZU1hbmFnZXIgZXh0ZW5kcyBXc0RPTVJ1bnRpbWVNYW5hZ2VyDQotCXsNCi0JCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGNyZWF0ZURPTVJ1bnRpbWUoZmluYWwgSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8sIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVET01SdW50aW1lKHJ1bnRpbWVJbmZvLCBtb25pdG9yKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vV3NET01SdW50aW1lUmVnaXN0cnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vV3NET01SdW50aW1lUmVnaXN0cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2ZmMyMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL1dzRE9NUnVudGltZVJlZ2lzdHJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnV0aWwuTmFtZWRFeHRlbnNpb25JbmZvOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuSVdzRE9NUnVudGltZUluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5Xc0RPTVJ1bnRpbWVSZWdpc3RyeTsNCi0NCi1wdWJsaWMgY2xhc3MgV3NET01SdW50aW1lUmVnaXN0cnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSdW50aW1lSW5mbyBleHRlbmRzIE5hbWVkRXh0ZW5zaW9uSW5mbyBpbXBsZW1lbnRzIElXc0RPTVJ1bnRpbWVJbmZvDQotCXsNCi0JCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvamVjdEZhY2V0czsNCi0JCQ0KLQkJUnVudGltZUluZm8oZmluYWwgU3RyaW5nIHBJZCwgZmluYWwgU3RyaW5nIHBMYWJlbCwgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvamVjdEZhY2V0cykNCi0JCXsNCi0JCQlzdXBlcihwSWQsIHBMYWJlbCk7DQotCQkJDQotCQkJdGhpcy5wcm9qZWN0RmFjZXRzID0gcHJvamVjdEZhY2V0czsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIEhhc2hNYXA8U3RyaW5nLFN0cmluZz4gZ2V0UHJvamVjdEZhY2V0cygpDQotCQl7DQotCQkJcmV0dXJuIHRoaXMucHJvamVjdEZhY2V0czsNCi0JCX0NCi0gCX0NCi0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFudGlhdGVSdW50aW1lKCkgDQotCXsNCi0JCUNvbGxlY3Rpb248SVdzRE9NUnVudGltZUluZm8+IHJ1bnRpbWVJbmZvcyA9IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKTsNCi0JCUl0ZXJhdG9yPElXc0RPTVJ1bnRpbWVJbmZvPiBydW50aW1lSW5mb0l0ZXIgPSBydW50aW1lSW5mb3MuaXRlcmF0b3IoKTsNCi0JCQ0KLQkJd2hpbGUocnVudGltZUluZm9JdGVyLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbyA9IHJ1bnRpbWVJbmZvSXRlci5uZXh0KCk7DQotCQkJDQotCQkJaWYocnVudGltZUluZm8uZ2V0SWQoKS5lcXVhbHMoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0IikNCi0JCQkJCXx8IHJ1bnRpbWVJbmZvLmdldElkKCkuZXF1YWxzKCJzdXBwb3J0ZWRydW50aW1ldGVzdDEiKSkNCi0JCQl7DQotCQkJCWFzc2VydE5vdE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuaW5zdGFudGlhdGVSdW50aW1lKHJ1bnRpbWVJbmZvKSk7DQotCQkJCWFzc2VydFRydWUoV3NET01SdW50aW1lUmVnaXN0cnkuaW5zdGFudGlhdGVSdW50aW1lKHJ1bnRpbWVJbmZvKSBpbnN0YW5jZW9mIFRlc3RXc0RPTVJ1bnRpbWVFeHRlbnNpb24pOw0KLQkJCX0NCi0JCQllbHNlIGlmKHJ1bnRpbWVJbmZvLmdldElkKCkuZXF1YWxzKCJzdXBwb3J0ZWRydW50aW1ldGVzdDIiKSkNCi0JCQl7DQotCQkJCWFzc2VydE51bGwoV3NET01SdW50aW1lUmVnaXN0cnkuaW5zdGFudGlhdGVSdW50aW1lKHJ1bnRpbWVJbmZvKSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5Lmluc3RhbnRpYXRlUnVudGltZShudWxsKSk7DQotCQkNCi0JCVJ1bnRpbWVJbmZvIGluZm8gPSBuZXcgUnVudGltZUluZm8oIlRzdCIsICJkZGdnIiwgbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKSk7DQotDQotCQlhc3NlcnROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5Lmluc3RhbnRpYXRlUnVudGltZShpbmZvKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZpbmRFeHRlbnNpb24oKSANCi0Jew0KLQkJYXNzZXJ0Tm90TnVsbChXc0RPTVJ1bnRpbWVSZWdpc3RyeS5maW5kRXh0ZW5zaW9uKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKS5pdGVyYXRvcigpLm5leHQoKSkpOw0KLQkJYXNzZXJ0TnVsbChXc0RPTVJ1bnRpbWVSZWdpc3RyeS5maW5kRXh0ZW5zaW9uKG51bGwpKTsNCi0JCQ0KLQkJUnVudGltZUluZm8gcnVudGltZUluZm8gPSBuZXcgUnVudGltZUluZm8oIlRzdCIsICJkZGdnIiwgbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKSk7DQotCQlhc3NlcnROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmZpbmRFeHRlbnNpb24ocnVudGltZUluZm8pKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVnaXN0ZXJlZFJ1bnRpbWVJbmZvKCkgDQotCXsNCi0JCUNvbGxlY3Rpb248SVdzRE9NUnVudGltZUluZm8+IHJ1bnRpbWVJbmZvcyA9IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChydW50aW1lSW5mb3MpOw0KLQkJYXNzZXJ0VHJ1ZShydW50aW1lSW5mb3Muc2l6ZSgpID49IDMpOw0KLQkJDQotCQlJdGVyYXRvcjxJV3NET01SdW50aW1lSW5mbz4gcnVudGltZUluZm9JdGVyID0gcnVudGltZUluZm9zLml0ZXJhdG9yKCk7DQotCQkNCi0JCXdoaWxlKHJ1bnRpbWVJbmZvSXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8gPSBydW50aW1lSW5mb0l0ZXIubmV4dCgpOw0KLQkJCQ0KLQkJCWFzc2VydE5vdE51bGwocnVudGltZUluZm8uZ2V0SWQoKSk7DQotCQkJDQotCQkJaWYocnVudGltZUluZm8uZ2V0SWQoKS5lcXVhbHMoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0IikpDQotCQkJew0KLQkJCQlhc3NlcnROb3ROdWxsKHJ1bnRpbWVJbmZvLmdldE5hbWUoKSk7DQotCQkJCWFzc2VydEVxdWFscyhydW50aW1lSW5mby5nZXROYW1lKCksICJUZXN0aW5nIik7DQotCQkJCQ0KLQkJCQlhc3NlcnROb3ROdWxsKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKSk7DQotCQkJCWFzc2VydEVxdWFscyhydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuc2l6ZSgpLCAyKTsNCi0JCQkJDQotCQkJCWFzc2VydFRydWUocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmNvbnRhaW5zS2V5KCJqc3Qud2ViIikpOw0KLQkJCQlhc3NlcnRUcnVlKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5jb250YWluc0tleSgidGVzdC5mYWNldCIpKTsNCi0JCQkJDQotCQkJCWFzc2VydEZhbHNlKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5jb250YWluc0tleSgianN0LndlYmIiKSk7DQotCQkJCWFzc2VydEZhbHNlKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5jb250YWluc0tleSgidGVzdC5mYWNldHQiKSk7DQotCQkJCQ0KLQkJCQlhc3NlcnROb3ROdWxsKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5nZXQoImpzdC53ZWIiKSk7DQotCQkJCWFzc2VydEVxdWFscyhydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuZ2V0KCJqc3Qud2ViIiksICIxLjAuMC4wIik7DQotCQkJCWFzc2VydE51bGwocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmdldCgidGVzdC5mYWNldCIpKTsNCi0JCQkJDQotCQkJCWFzc2VydE51bGwocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmdldCgiZHVtbXkuZmFjZXQiKSk7DQotCQkJfQ0KLQkJCWVsc2UgaWYocnVudGltZUluZm8uZ2V0SWQoKS5lcXVhbHMoInN1cHBvcnRlZHJ1bnRpbWV0ZXN0MSIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0Tm90TnVsbChydW50aW1lSW5mby5nZXROYW1lKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMocnVudGltZUluZm8uZ2V0TmFtZSgpLCAiVGVzdGluZzEiKTsNCi0JCQkJDQotCQkJCWFzc2VydE5vdE51bGwocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5zaXplKCksIDIpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0VHJ1ZShydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuY29udGFpbnNLZXkoImpzdC53ZWJiIikpOw0KLQkJCQlhc3NlcnRUcnVlKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5jb250YWluc0tleSgidGVzdC5mYWNldHQiKSk7DQotCQkJCQ0KLQkJCQlhc3NlcnRGYWxzZShydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuY29udGFpbnNLZXkoImpzdC53ZWIiKSk7DQotCQkJCWFzc2VydEZhbHNlKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5jb250YWluc0tleSgidGVzdC5mYWNldCIpKTsNCi0JCQkJDQotCQkJCWFzc2VydE5vdE51bGwocnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpLmdldCgianN0LndlYmIiKSk7DQotCQkJCWFzc2VydEVxdWFscyhydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuZ2V0KCJqc3Qud2ViYiIpLCAiMS4wLjAuMCIpOw0KLQkJCQlhc3NlcnROdWxsKHJ1bnRpbWVJbmZvLmdldFByb2plY3RGYWNldHMoKS5nZXQoInRlc3QuZmFjZXR0IikpOw0KLQkJCQkNCi0JCQkJYXNzZXJ0TnVsbChydW50aW1lSW5mby5nZXRQcm9qZWN0RmFjZXRzKCkuZ2V0KCJkdW1teS5mYWNldCIpKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UnVudGltZUluZm8oKQ0KLQl7DQotCQlhc3NlcnROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKCJ0ZXN0LmlkIikpOw0KLQkJYXNzZXJ0Tm90TnVsbChXc0RPTVJ1bnRpbWVSZWdpc3RyeS5nZXRSdW50aW1lSW5mbygic3VwcG9ydGVkcnVudGltZXRlc3QiKSk7DQotCQlhc3NlcnROb3ROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKCJzdXBwb3J0ZWRydW50aW1ldGVzdDEiKSk7DQotCQlhc3NlcnROdWxsKFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJ1bnRpbWVJbmZvKG51bGwpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvQ29tcGlsYXRpb25Vbml0RmluZGVyQ29udHJhY3RUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvQ29tcGlsYXRpb25Vbml0RmluZGVyQ29udHJhY3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkYjRkMWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0NvbXBpbGF0aW9uVW5pdEZpbmRlckNvbnRyYWN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUNvbXBpbGF0aW9uVW5pdEZpbmRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklDb21waWxhdGlvblVuaXRIYW5kbGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSVByb2plY3RTZWxlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuam1vY2suY29yZS5Db25zdHJhaW50Ow0KLWltcG9ydCBvcmcuam1vY2suY29yZS5JbnZvY2F0aW9uOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5TdHViOw0KLQ0KLS8qKg0KLSAqIFRoZSB0ZXN0cyBpbiB0aGlzIGNsYXNzIG1pZ2h0IGJlIGV4ZWN1dGVkIGluIGEgZGlydHkgd29ya3NwYWNlLiBUaHVzIHRoaXMgY2xhc3Mgc2hvdWxkIGFzc3VtZSB0aGF0IG90aGVyIHByb2plY3RzIGFyZSBhbHJlYWR5IGV4aXN0aW5nIGFuZCBpZ25vcmUgdGhlbQ0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcGlsYXRpb25Vbml0RmluZGVyQ29udHJhY3RUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLS8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdEZpbmRlciB0YXJnZXQ7DQotCXByaXZhdGUgTGlzdDxJUHJvamVjdFNlbGVjdG9yPiBwcm9qZWN0U2VsZWN0b3JzOw0KLQkNCi0JcHJpdmF0ZSBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JDQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGV4aXN0aW5nUHJvamVjdHNOYW1lczsNCi0JDQotCXByb3RlY3RlZCBJSmF2YU1vZGVsIGphdmFNb2RlbCgpIHsNCi0JCXJldHVybiBqYXZhTW9kZWw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBMaXN0PElQcm9qZWN0U2VsZWN0b3I+IHByb2plY3RTZWxlY3RvcnMoKSB7DQotCQlyZXR1cm4gcHJvamVjdFNlbGVjdG9yczsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGFic3RyYWN0IElDb21waWxhdGlvblVuaXRGaW5kZXIgY3JlYXRlVGFyZ2V0KCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7DQotCQkNCi0JCWphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JCXByb2plY3RTZWxlY3RvcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0U2VsZWN0b3I+KCk7DQotCQlleGlzdGluZ1Byb2plY3RzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0JCWZvciAoSVByb2plY3QgcHJqIDogKElQcm9qZWN0W10pamF2YU1vZGVsLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKQ0KLQkJew0KLQkJCWV4aXN0aW5nUHJvamVjdHNOYW1lcy5hZGQocHJqLmdldE5hbWUoKSk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfZmluZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiB7DQotCQ0KLQkJDQotCQlmaW5hbCBUZXN0UHJvamVjdCBwcm9qZWN0MSA9IG5ldyBUZXN0UHJvamVjdCgpOw0KLQkJcHJvamVjdDEuY3JlYXRlU291cmNlRm9sZGVyKCJzb3VyY2VGb2xkZXIiKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGYxID0gcHJvamVjdDEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0MSIpOw0KLQkJcHJvamVjdDEuY3JlYXRlVHlwZShwZjEsICJDb21waWxhdGlvblVuaXQxLmphdmEiLCAiY2xhc3MgSWdub3JyZWR7fSIpOw0KLQkJcHJvamVjdDEuY3JlYXRlVHlwZShwZjEsICJDb21waWxhdGlvblVuaXQyLmphdmEiLCAiY2xhc3MgSWdub3JyZWR7fSIpOw0KLQkJcHJvamVjdDEuY3JlYXRlVHlwZShwZjEsICJDb21waWxhdGlvblVuaXQzLmphdmEiLCAiY2xhc3MgSWdub3JyZWR7fSIpOw0KLQkJDQotCQlmaW5hbCBUZXN0UHJvamVjdCBwcm9qZWN0MiA9IG5ldyBUZXN0UHJvamVjdCgpOw0KLQkJcHJvamVjdDIuY3JlYXRlU291cmNlRm9sZGVyKCJzb3VyY2VGb2xkZXIiKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGYyID0gcHJvamVjdDIuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0MSIpOw0KLQkJcHJvamVjdDIuY3JlYXRlVHlwZShwZjIsICJDb21waWxhdGlvblVuaXQxLmphdmEiLCAiY2xhc3MgSWdub3JyZWR7fSIpOw0KLQkJcHJvamVjdDIuY3JlYXRlVHlwZShwZjIsICJDb21waWxhdGlvblVuaXQyLmphdmEiLCAiY2xhc3MgSWdub3JyZWR7fSIpOw0KLQkJDQotCQlmaW5hbCBUZXN0UHJvamVjdCBwcm9qZWN0MyA9IG5ldyBUZXN0UHJvamVjdCgpOw0KLQkJcHJvamVjdDMuY3JlYXRlU291cmNlRm9sZGVyKCJzb3VyY2VGb2xkZXIiKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGYzID0gcHJvamVjdDMuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0MyIpOw0KLQkJcHJvamVjdDMuY3JlYXRlVHlwZShwZjMsICJDb21waWxhdGlvblVuaXQxLmphdmEiLCAiY2xhc3MgSWdub3JyZWR7fSIpOw0KLQkJcHJvamVjdDMuY3JlYXRlVHlwZShwZjMsICJDb21waWxhdGlvblVuaXQyLmphdmEiLCAiY2xhc3MgSWdub3JyZWR7fSIpOw0KLQkNCi0JCWZpbmFsIElQcm9qZWN0U2VsZWN0b3IgZXhsdWRlUHJvamVjdDIgPSBuZXcgSVByb2plY3RTZWxlY3RvcigpIHsNCi0NCi0JCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopDQotCQkJew0KLQkJCQlyZXR1cm4gcHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHByb2plY3QyLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkgfHwgZXhpc3RpbmdQcm9qZWN0c05hbWVzLmNvbnRhaW5zKHByai5nZXRFbGVtZW50TmFtZSgpKT8gZmFsc2UgOiB0cnVlOw0KLQkJCX0NCi0JCQkNCi0JCX07DQotCQkNCi0JCWZpbmFsIElQcm9qZWN0U2VsZWN0b3IgYWRkbWl0QWxsX2V4Y2VwdFByb2plY3QyID0gbmV3IElQcm9qZWN0U2VsZWN0b3IoKSB7DQotCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZShJSmF2YVByb2plY3QgcHJqKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwcm9qZWN0Mi5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpIHx8IGV4aXN0aW5nUHJvamVjdHNOYW1lcy5jb250YWlucyhwcmouZ2V0RWxlbWVudE5hbWUoKSkgPyBmYWxzZSA6IHRydWU7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJcHJvamVjdFNlbGVjdG9ycygpLmFkZChleGx1ZGVQcm9qZWN0Mik7DQotCQlwcm9qZWN0U2VsZWN0b3JzKCkuYWRkKGFkZG1pdEFsbF9leGNlcHRQcm9qZWN0Mik7DQotDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0RmluZGVyIHRhcmdldCA9IGNyZWF0ZVRhcmdldCgpOw0KLQkJCQ0KLQkJDQotCQlmaW5hbCBNb2NrPElDb21waWxhdGlvblVuaXRIYW5kbGVyPiBtb2NrQ1VIYW5kbGVyID0gbW9jayhJQ29tcGlsYXRpb25Vbml0SGFuZGxlci5jbGFzcyk7DQotCQkNCi0JCWZpbmFsIFN0dWIgY29uZmlndXJlRXhwZWN0YXRpb25zID0gbmV3IFN0dWIoKSANCi0JCXsNCi0NCi0JCQlwdWJsaWMgT2JqZWN0IGludm9rZShJbnZvY2F0aW9uIGFyZzApIHRocm93cyBUaHJvd2FibGUNCi0JCQl7DQotCQkJCW1vY2tDVUhhbmRsZXIuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiaGFuZGxlIikud2l0aChwcm9qZWN0TmFtZWQocHJvamVjdDEuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSkuaWQoImN1Q2FsbDEiKTsNCi0JCQkJbW9ja0NVSGFuZGxlci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJoYW5kbGUiKS53aXRoKGN1TmFtZWQocGYxLmdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGlsYXRpb25Vbml0MS5qYXZhIikuZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSkpLmFmdGVyKCJjdUNhbGwxIikuaWQoImN1Q2FsbDIiKTsNCi0JCQkJbW9ja0NVSGFuZGxlci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJoYW5kbGUiKS53aXRoKGN1TmFtZWQocGYxLmdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGlsYXRpb25Vbml0Mi5qYXZhIikuZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSkpLmFmdGVyKCJjdUNhbGwxIikuaWQoImN1Q2FsbDMiKTsNCi0JCQkJbW9ja0NVSGFuZGxlci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJoYW5kbGUiKS53aXRoKGN1TmFtZWQocGYxLmdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGlsYXRpb25Vbml0My5qYXZhIikuZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSkpLmFmdGVyKCJjdUNhbGwxIikuaWQoImN1Q2FsbDQiKTsNCi0JCQkJDQotCQkJCW1vY2tDVUhhbmRsZXIuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiaGFuZGxlIikud2l0aChwcm9qZWN0TmFtZWQocHJvamVjdDMuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSkuaWQoImN1Q2FsbDUiKTsNCi0JCQkJbW9ja0NVSGFuZGxlci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJoYW5kbGUiKS53aXRoKGN1TmFtZWQocGYzLmdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGlsYXRpb25Vbml0MS5qYXZhIikuZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSkpLmFmdGVyKCJjdUNhbGw1IikuaWQoImN1Q2FsbDYiKTsNCi0JCQkJbW9ja0NVSGFuZGxlci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJoYW5kbGUiKS53aXRoKGN1TmFtZWQocGYzLmdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGlsYXRpb25Vbml0Mi5qYXZhIikuZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSkpLmFmdGVyKCJjdUNhbGw1IikuaWQoImN1Q2FsbDciKTsNCi0JCQkJbW9ja0NVSGFuZGxlci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJmaW5pc2hlZCIpLndpdGhOb0FyZ3VtZW50cygpLmFmdGVyKCJjdUNhbGwxIikuYWZ0ZXIoImN1Q2FsbDIiKS5hZnRlcigiY3VDYWxsMyIpLmFmdGVyKCJjdUNhbGw0IikuYWZ0ZXIoImN1Q2FsbDUiKS5hZnRlcigiY3VDYWxsNiIpLmFmdGVyKCJjdUNhbGw3Iik7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgU3RyaW5nQnVmZmVyIGRlc2NyaWJlVG8oU3RyaW5nQnVmZmVyIGFyZzApDQotCQkJew0KLQkJCQlyZXR1cm4gYXJnMC5hcHBlbmQoIkNvbmZpZ3VyZSBleHBlY3RhdGlvbnMgYWZ0ZXIgc3RhcnQgaXMgaW52b2tlZCIpOw0KLQkJCX0NCi0JCQkNCi0JCX07DQotCQltb2NrQ1VIYW5kbGVyLmV4cGVjdHMob25jZSgpKS5tZXRob2QoInN0YXJ0ZWQiKS53aXRoTm9Bcmd1bWVudHMoKS53aWxsKGNvbmZpZ3VyZUV4cGVjdGF0aW9ucyk7DQotCQl0YXJnZXQuZmluZChudWxsLCBtb2NrQ1VIYW5kbGVyLnByb3h5KCkpOw0KLQl9DQotCQ0KLQlwcml2YXRlIENvbnN0cmFpbnQgcHJvamVjdE5hbWVkKGZpbmFsIFN0cmluZyBwcmpOYW1lKSB7DQotCQlyZXR1cm4gbmV3IENvbnN0cmFpbnQoKSB7DQotCQkJcHVibGljIFN0cmluZ0J1ZmZlciBkZXNjcmliZVRvKFN0cmluZ0J1ZmZlciBhcmcwKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFyZzAuYXBwZW5kKHByak5hbWUpOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgYm9vbGVhbiBldmFsKE9iamVjdCBhcmcwKQ0KLQkJCXsNCi0JCQkJaWYgKCEoYXJnMCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkpDQotCQkJCXsNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJfQ0KLQkJCQlmaW5hbCBJSmF2YVByb2plY3QgY2FzdCA9IChJSmF2YVByb2plY3QpYXJnMDsNCi0JCQkJcmV0dXJuIHByak5hbWUuZXF1YWxzKGNhc3QuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJfQ0KLQkJfTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBDb25zdHJhaW50IGN1TmFtZWQoZmluYWwgU3RyaW5nIGN1TmFtZSkgew0KLQkJcmV0dXJuIG5ldyBDb25zdHJhaW50KCkgew0KLQkJCXB1YmxpYyBTdHJpbmdCdWZmZXIgZGVzY3JpYmVUbyhTdHJpbmdCdWZmZXIgYXJnMCkNCi0JCQl7DQotCQkJCXJldHVybiBhcmcwLmFwcGVuZChjdU5hbWUpOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgYm9vbGVhbiBldmFsKE9iamVjdCBhcmcwKQ0KLQkJCXsNCi0JCQkJaWYgKCEoYXJnMCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCX0NCi0JCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjYXN0ID0gKElDb21waWxhdGlvblVuaXQpYXJnMDsNCi0JCQkJcmV0dXJuIGN1TmFtZS5lcXVhbHMoY2FzdC5nZXRQYXRoKCkudG9PU1N0cmluZygpKTsNCi0JCQl9DQotCQl9Ow0KLQkJCQ0KLQl9DQotCQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvRG9tVGVzdFV0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvRG9tVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlYmI2YTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0RvbVRlc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOw0KLQ0KLXB1YmxpYyBjbGFzcyBEb21UZXN0VXRpbHMNCi17DQotCXB1YmxpYyBJTWV0aG9kIGdldEV4aXN0aW5nTWV0aG9kKElUeXBlIHR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmcuLi4gYXJncykNCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtID0gdHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7DQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShtLmV4aXN0cygpKTsNCi0JCXJldHVybiBtOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRzKElDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyBjb250ZW50cykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgY29udGVudFRvU2V0ID0gInBhY2thZ2UgIitjdS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpKyI7XG4iK2NvbnRlbnRzOw0KLQkJRmlsZVV0aWxzLmdldEluc3RhbmNlKCkuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChjdSwgY29udGVudFRvU2V0LCB0cnVlLCBudWxsKTsNCi0JfQ0KLQkNCi0JcHVibGljIElXZWJQYXJhbSBmaW5kUGFyYW0oZmluYWwgSVdlYk1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyBpbXBsTmFtZSkgDQotCXsNCi0JCWZvciAoSVdlYlBhcmFtIHBhcmFtIDogbWV0aG9kLmdldFBhcmFtZXRlcnMoKSkgew0KLQkJCWlmIChwYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsTmFtZSkpIHsNCi0JCQkJcmV0dXJuIHBhcmFtOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotCQ0KLQkNCi0JcHVibGljIElXZWJNZXRob2QgZmluZFdlYk1ldGhvZEJ5TmFtZShmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgU3RyaW5nIG5hbWUpIA0KLQl7DQotCQlmb3IgKElXZWJNZXRob2Qgd2ViTWV0aG9kIDogc2VpLmdldFdlYk1ldGhvZHMoKSkgew0KLQkJCWlmKHdlYk1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7DQotCQkJCXJldHVybiB3ZWJNZXRob2Q7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkJDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTNlZTdiYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotcHVibGljIGNsYXNzIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRSA9ICJtZXRob2QiOw0KLQkNCi0JcHJpdmF0ZSBNb2NrPElXZWJNZXRob2Q+IHdlYk1ldGhvZDsNCi0JcHJpdmF0ZSBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvciBkZWZDYWxjID0gbmV3IEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yKCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQl3ZWJNZXRob2QgPSBtb2NrKElXZWJNZXRob2QuY2xhc3MpOw0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1N0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKSk7DQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSkpOw0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZShNRVRIT0RfTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmaW5lU0JTdHlsZURlZmF1bHRWYWx1ZSgpIA0KLQl7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCwgZGVmQ2FsYy5kZWZpbmVTQlN0eWxlKG51bGwpKTsNCi0NCi0JCU1vY2s8SUFubm90YXRpb248SVR5cGU+PiBhbm4gPSBtb2NrKElBbm5vdGF0aW9uLmNsYXNzKTsNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQsIGRlZkNhbGMuZGVmaW5lU0JTdHlsZShhbm4ucHJveHkoKSkpOw0KLQkJDQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJTdHlsZS5ET0NVTUVOVCIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5ULCBkZWZDYWxjLmRlZmluZVNCU3R5bGUoYW5uLnByb3h5KCkpKTsNCi0JCQ0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCwgZGVmQ2FsYy5kZWZpbmVTQlN0eWxlKGFubi5wcm94eSgpKSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNCU3R5bGUoKSANCi0Jew0KLQkJTW9jazxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubiA9IG1vY2soSUFubm90YXRpb24uY2xhc3MpOw0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiU3R5bGUuUlBDIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuUlBDLCBkZWZDYWxjLmRlZmluZVNCU3R5bGUoYW5uLnByb3h5KCkpKTsNCi0NCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIlNPQVBCaW5kaW5nLlN0eWxlLlJQQyIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLlJQQywgZGVmQ2FsYy5kZWZpbmVTQlN0eWxlKGFubi5wcm94eSgpKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTQlVzZURlZmF1bHRWYWx1ZSgpIA0KLQl7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuTElURVJBTCwgZGVmQ2FsYy5kZWZpbmVTQlVzZShudWxsKSk7DQotDQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKG51bGwpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5MSVRFUkFMLCBkZWZDYWxjLmRlZmluZVNCVXNlKGFubi5wcm94eSgpKSk7DQotCQkNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIlN0eWxlLkxJVEVSQUwiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuTElURVJBTCwgZGVmQ2FsYy5kZWZpbmVTQlVzZShhbm4ucHJveHkoKSkpOw0KLQkJDQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJTT0FQQmluZGluZy5TdHlsZS5MSVRFUkFMIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwsIGRlZkNhbGMuZGVmaW5lU0JVc2UoYW5uLnByb3h5KCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNCVXNlKCkNCi0Jew0KLQkJTW9jazxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubiA9IG1vY2soSUFubm90YXRpb24uY2xhc3MpOw0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiVXNlLkVOQ09ERUQiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuRU5DT0RFRCwgZGVmQ2FsYy5kZWZpbmVTQlVzZShhbm4ucHJveHkoKSkpOw0KLQ0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiU09BUEJpbmRpbmcuVXNlLkVOQ09ERUQiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuRU5DT0RFRCwgZGVmQ2FsYy5kZWZpbmVTQlVzZShhbm4ucHJveHkoKSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3REZWZpbmVTQlBhcmFtZXRlclN0eWxlRGVmYXVsdFZhbHVlKCkgDQotCXsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQsIGRlZkNhbGMuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShudWxsKSk7DQotDQotCQlNb2NrPElBbm5vdGF0aW9uPElUeXBlPj4gYW5uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKG51bGwpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQsIGRlZkNhbGMuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShhbm4ucHJveHkoKSkpOw0KLQkJDQotCQlhbm4uc3R1YnMoKS5tZXRob2QoImdldFByb3BlcnR5VmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEIikpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCwgZGVmQ2FsYy5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKGFubi5wcm94eSgpKSk7DQotCQkNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UHJvcGVydHlWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQiKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELCBkZWZDYWxjLmRlZmluZVNCUGFyYW1ldGVyU3R5bGUoYW5uLnByb3h5KCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmluZVNCUGFyYW1ldGVyU3R5bGUoKSANCi0Jew0KLQkJTW9jazxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubiA9IG1vY2soSUFubm90YXRpb24uY2xhc3MpOw0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiUGFyYW1ldGVyU3R5bGUuQkFSRSIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUsIGRlZkNhbGMuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShhbm4ucHJveHkoKSkpOw0KLQ0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQcm9wZXJ0eVZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSIpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUsIGRlZkNhbGMuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShhbm4ucHJveHkoKSkpOwkNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSgpIA0KLQl7DQotCQlhc3NlcnRFcXVhbHMoTUVUSE9EX05BTUUsIGRlZkNhbGMuY2FsY1dlYlBhcmFtRGVmYXVsdE5hbWUod2ViTWV0aG9kLnByb3h5KCksIDApKTsNCi0JCQ0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1N0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1N0eWxlLlJQQykpOw0KLQkJYXNzZXJ0RXF1YWxzKCJhcmcwIiwgZGVmQ2FsYy5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJNZXRob2QucHJveHkoKSwgMCkpOw0KLQkJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpKTsNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIpLndpbGwocmV0dXJuVmFsdWUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKSk7DQotCQlhc3NlcnRFcXVhbHMoImFyZzEiLCBkZWZDYWxjLmNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYk1ldGhvZC5wcm94eSgpLCAxKSk7CQkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsY1dlYlBhcmFtRGVmYXVsdFRhcmdldE5TKCkgDQotCXsNCi0JCU1vY2s8SVdlYlBhcmFtPiB3ZWJQYXJhbSA9IG1vY2soSVdlYlBhcmFtLmNsYXNzKTsNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIpLndpbGwocmV0dXJuVmFsdWUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKSk7CQkNCi0JCXdlYlBhcmFtLnN0dWJzKCkubWV0aG9kKCJpc0hlYWRlciIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCQ0KLQkJTW9jazxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBzZWkgPSBtb2NrKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MpOw0KLQkJc2VpLnN0dWJzKCkubWV0aG9kKCJnZXRUYXJnZXROYW1lc3BhY2UiKS53aWxsKHJldHVyblZhbHVlKCJodHRwOi8vY29tLnNhcC50ZXN0IikpOwkJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImVDb250YWluZXIiKS53aWxsKHJldHVyblZhbHVlKHNlaS5wcm94eSgpKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygiIiwgZGVmQ2FsYy5jYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMod2ViTWV0aG9kLnByb3h5KCksIHdlYlBhcmFtLnByb3h5KCkpKTsNCi0NCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZ2V0U29hcEJpbmRpbmdTdHlsZSIpLndpbGwocmV0dXJuVmFsdWUoU09BUEJpbmRpbmdTdHlsZS5SUEMpKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vY29tLnNhcC50ZXN0IiwgZGVmQ2FsYy5jYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMod2ViTWV0aG9kLnByb3h5KCksIHdlYlBhcmFtLnByb3h5KCkpKTsNCi0JCQ0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1N0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKSk7CQ0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vY29tLnNhcC50ZXN0IiwgZGVmQ2FsYy5jYWxjV2ViUGFyYW1EZWZhdWx0VGFyZ2V0TlMod2ViTWV0aG9kLnByb3h5KCksIHdlYlBhcmFtLnByb3h5KCkpKTsNCi0JCQ0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1N0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKSk7CQ0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQpKTsNCi0JCXdlYlBhcmFtLnN0dWJzKCkubWV0aG9kKCJpc0hlYWRlciIpLndpbGwocmV0dXJuVmFsdWUodHJ1ZSkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9jb20uc2FwLnRlc3QiLCBkZWZDYWxjLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QucHJveHkoKSwgd2ViUGFyYW0ucHJveHkoKSkpOwkJDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENhbGNXZWJSZXN1bHREZWZhdWx0TmFtZSgpIA0KLQl7DQotCQlhc3NlcnRFcXVhbHMoTUVUSE9EX05BTUUgKyAiUmVzcG9uc2UiLCBkZWZDYWxjLmNhbGNXZWJSZXN1bHREZWZhdWx0TmFtZSh3ZWJNZXRob2QucHJveHkoKSkpOw0KLQkJDQotCQl3ZWJNZXRob2Quc3R1YnMoKS5tZXRob2QoImdldFNvYXBCaW5kaW5nU3R5bGUiKS53aWxsKHJldHVyblZhbHVlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKSk7DQotCQlhc3NlcnRFcXVhbHMoInJldHVybiIsIGRlZkNhbGMuY2FsY1dlYlJlc3VsdERlZmF1bHROYW1lKHdlYk1ldGhvZC5wcm94eSgpKSk7DQotCQkNCi0JCXdlYk1ldGhvZC5zdHVicygpLm1ldGhvZCgiZ2V0U29hcEJpbmRpbmdTdHlsZSIpLndpbGwocmV0dXJuVmFsdWUoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCkpOw0KLQkJd2ViTWV0aG9kLnN0dWJzKCkubWV0aG9kKCJnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIikud2lsbChyZXR1cm5WYWx1ZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQpKTsNCi0JCWFzc2VydEVxdWFscygicmV0dXJuIiwgZGVmQ2FsYy5jYWxjV2ViUmVzdWx0RGVmYXVsdE5hbWUod2ViTWV0aG9kLnByb3h5KCkpKTsJCQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2ZmRiMjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSVByb2plY3RTZWxlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi0vKioNCi0gKiBUaGlzIHRlc3QgbWlnaHQgYmUgZXhlY3V0ZWQgaW4gbm9uLWNsZWFuIHdvcmtzcGFjZS4gVGh1cyBpdCBzaG91bGQgdHJ5IHRvIGlnbm9yZSBhbnkgZXhpc3RpbmcgcHJvamVjdHMgYW5kIHdvcmsgd2l0aCB0aGUgdGVzdCBwcm9lamN0cyBpdCBjcmVhdGVzLg0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByb2plY3Q7DQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBwZjsNCi0JcHJpdmF0ZSBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJc3VwZXIuc2V0VXAoKTsNCi0JCXRlc3RQcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQl0ZXN0UHJvamVjdC5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJcGYgPSB0ZXN0UHJvamVjdC5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3Quc21va2UiKTsNCi0JCWphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFZlcmlmaWVzIHRoYXQgYSBzaW1wbGUgcHJvamVjdCB3aXRoIG9uZSB3ZWIgc2VydmljZSBjbGFzcyBhbmQgb25lIHNlaSBjYW4gYmUgcGFyc2VkDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0X1Ntb2tlX09uZVdzQW5kT25lU2VpKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24NCi0Jew0KLQkJdGVzdFByb2plY3QuY3JlYXRlVHlwZShwZiwgIlNlaTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGludGVyZmFjZSBTZWkxIHt9Iik7DQotCQl0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHBmLCAiV2ViU2VydmljZTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3Quc21va2UuU2VpMVwiKSBwdWJsaWMgY2xhc3MgV2ViU2VydmljZTF7fSIpOw0KLQkJZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXQgPSBjcmVhdGVKYXhXc1dvcmtzcGFjZVJlc291cmNlKHRlc3RQcm9qZWN0KTsNCi0JCXRhcmdldC5sb2FkKG51bGwpOw0KLQkJDQotCQkvL2ZpbmQgdGhlIHRlc3QgcHJvamVjdCBhbmQgd29yayBvbmx5IHdpdGggaXQuIGlnbm9yZSBhbnkgb3RoZXIgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZQ0KLQkJZmluYWwgTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IHByb2plY3RzID0gdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpOw0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHRlc3RXc1Byb2plY3QgPSBudWxsOw0KLQkJZm9yIChJV2ViU2VydmljZVByb2plY3QgYVByb2plY3QgOiBwcm9qZWN0cykNCi0JCXsNCi0JCQlpZiAoYVByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0ZXN0UHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJdGVzdFdzUHJvamVjdCA9IGFQcm9qZWN0Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQlpZiAodGVzdFdzUHJvamVjdCA9PSBudWxsKQ0KLQkJew0KLQkJCWZhaWwoIldlYlNlcnZpY2VQcm9qZWN0IHdpdCBuYW1lICIgKyB0ZXN0UHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkgKyAiaXMgbm90IGZvdW5kIGluIHRoZSBtb2RlbCIpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IHNlaXMgPSB0ZXN0V3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsNCi0JCWFzc2VydFRydWUoIk1vcmUgdGhhbiAxIHNlaSBmb3VuZCBpbiB0aGUgbW9kZWwsIHdoaWxlIG9ubHkgb25lIHRlc3Qgc2VpIHdhcyB1c2VkIiwgc2Vpcy5zaXplKCkgPT0gMSk7DQotCQlhc3NlcnRFcXVhbHMoIlRoZSBzZWkgaW4gdGhlIG1vZGVsIGlzIHdpdGggZGlmZmVyZW50IG5hbWUiLCAiU2VpMSIsIHNlaXMuZ2V0KDApLmdldE5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoIlRoZSBzZWkgaW4gdGhlIG1vZGVsIGlzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIiwgImNvbS5zYXAudGVzdC5zbW9rZS5TZWkxIiwgc2Vpcy5nZXQoMCkuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlmaW5hbCBMaXN0PElXZWJTZXJ2aWNlPiB3ZWJTZXJ2aWNlcyA9IHRlc3RXc1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKTsNCi0JCWFzc2VydFRydWUoIk1vcmUgdGhhbiAxIHdlYiBzZXJ2aWNlIGZvdW5kIGluIHRoZSBtb2RlbCwgd2hpbGUgb25seSBvbmUgdGVzdCB3ZWIgc2VydmljZSB3YXMgdXNlZCIsIHdlYlNlcnZpY2VzLnNpemUoKSA9PSAxKTsNCi0JCWFzc2VydEVxdWFscygiVGhlIHdlYiBzZXJ2aWNlIGluIHRoZSBtb2RlbCBpcyB3aXRoIGRpZmZlcmVudCBuYW1lIiwgIldlYlNlcnZpY2UxU2VydmljZSIsIHdlYlNlcnZpY2VzLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJUaGUgd2ViIHNlcnZpY2UgaW4gdGhlIG1vZGVsIGlzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIiwgImNvbS5zYXAudGVzdC5zbW9rZS5XZWJTZXJ2aWNlMSIsIHdlYlNlcnZpY2VzLmdldCgwKS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydFNhbWUoIlRoZSBzZXJ2aWNlIGVuZHBvaW50IGZvdW5kIGluIHRoZSBtb2RlbCBpcyBub3QgdGhlIHNhbWUgaW5zdGFuY2UgYXMgdGhlIHNlaSBvZiB0aGUgd2ViIHNlcnZpY2UiLCB3ZWJTZXJ2aWNlcy5nZXQoMCkuZ2V0U2VydmljZUVuZHBvaW50KCksIHNlaXMuZ2V0KDApKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9Eb21Mb2FkZWRGb3JOb1Byb2Nlc3NlZFByb2plY3RzKCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0ID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsKSANCi0JCXsNCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgSVByb2plY3RTZWxlY3RvcltdIGdldFByb2plY3RTZWxlY3RvcnMoKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIG5ldyBJUHJvamVjdFNlbGVjdG9yW10geyBuZXcgSVByb2plY3RTZWxlY3RvcigpIA0KLQkJCQl7DQotDQotCQkJCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQl9fTsNCi0JCQl9DQotCQkJDQotCQl9Ow0KLQkJdGFyZ2V0LmxvYWQobnVsbCk7DQotCQlhc3NlcnROb3ROdWxsKHRhcmdldC5nZXRET00oKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLnNpemUoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBjcmVhdGVKYXhXc1dvcmtzcGFjZVJlc291cmNlKGZpbmFsIFRlc3RQcm9qZWN0IHRlc3RQcm9qZWN0KQ0KLQl7DQotCQlyZXR1cm4gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsKSANCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgSVByb2plY3RTZWxlY3RvcltdIGdldFByb2plY3RTZWxlY3RvcnMoKSANCi0JCQl7DQotCQkJCXJldHVybiBuZXcgSVByb2plY3RTZWxlY3RvcltdIHtuZXcgSVByb2plY3RTZWxlY3RvcigpDQotCQkJCXsNCi0JCQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikgew0KLQkJCQkJCXJldHVybiBwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModGVzdFByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQkJCX0NCi0JCQkJfX07DQotCQkJfQ0KLQkJfTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGNsYXNzIExvYWRMaXN0ZW5lciBpbXBsZW1lbnRzIElXc0RvbUxvYWRMaXN0ZW5lcg0KLQl7DQotCQlib29sZWFuIHN0YXJ0Q2FsbGVkOw0KLQkJYm9vbGVhbiBmaW5pc2hlZENhbGxlZDsNCi0JCQ0KLQkJcHVibGljIHZvaWQgZmluaXNoZWQoKSB7DQotCQkJZmluaXNoZWRDYWxsZWQgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgc3RhcnRlZCgpIHsNCi0JCQlzdGFydENhbGxlZCA9IHRydWU7DQotCQl9DQotCX0NCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0plZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyMGJhZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL0plZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuSVdhaXRDb25kaXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucy5Bc3NlcnRpb25zOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciBKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbiBleHRlbnNpb247DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZXh0ZW5zaW9uID0gbmV3IEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24oKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldERPTUNyZWF0ZU5vdENhbGxlZCgpIHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiANCi0Jew0KLQkJYXNzZXJ0TnVsbChleHRlbnNpb24uZ2V0RE9NKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RMb2FkTGlzdGVuZXJTdGFydEZpbmlzaENhbGxlZCgpIHRocm93cyBFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIE1vY2s8SVdzRG9tTG9hZExpc3RlbmVyPiBsb2FkTGlzdGVuZXJNb2NrID0gbW9jayhJV3NEb21Mb2FkTGlzdGVuZXIuY2xhc3MpOw0KLQkJbG9hZExpc3RlbmVyTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJzdGFydGVkIik7DQotCQlsb2FkTGlzdGVuZXJNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImZpbmlzaGVkIik7DQotCQkNCi0JCWV4dGVuc2lvbi5hZGRMb2FkTGlzdGVuZXIobG9hZExpc3RlbmVyTW9jay5wcm94eSgpKTsNCi0JCWV4dGVuc2lvbi5jcmVhdGVET00obnVsbCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUxvYWRMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElXc0RvbUxvYWRMaXN0ZW5lciBsb2FkTGlzdGVuZXIgPSAoSVdzRG9tTG9hZExpc3RlbmVyKSBtb2NrKElXc0RvbUxvYWRMaXN0ZW5lci5jbGFzcykucHJveHkoKTsNCi0JCWV4dGVuc2lvbi5hZGRMb2FkTGlzdGVuZXIobG9hZExpc3RlbmVyKTsNCi0JCWV4dGVuc2lvbi5yZW1vdmVMb2FkTGlzdGVuZXIobG9hZExpc3RlbmVyKTsNCi0JCWV4dGVuc2lvbi5jcmVhdGVET00obnVsbCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RMb2FkQ2FuY2VsZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7DQotCQltb25pdG9yLnNldENhbmNlbGVkKHRydWUpOw0KLQkJDQotCQlmaW5hbCBNb2NrPElXc0RvbUxvYWRMaXN0ZW5lcj4gbG9hZExpc3RlbmVyTW9jayA9IG1vY2soSVdzRG9tTG9hZExpc3RlbmVyLmNsYXNzKTsNCi0JCWxvYWRMaXN0ZW5lck1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgic3RhcnRlZCIpOw0KLQkJbG9hZExpc3RlbmVyTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJmaW5pc2hlZCIpOw0KLQkJZXh0ZW5zaW9uID0gbmV3IEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24oKSB7DQotCQkJQE92ZXJyaWRlDQotCQkJcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7IA0KLQkJCQlyZXR1cm4gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsKCkpIHsNCi0JCQkJCUBPdmVycmlkZQ0KLQkJCQkJcHVibGljIGJvb2xlYW4gaXNMb2FkQ25hY2VsZWQoKSB7DQotCQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCQl9DQotCQkJCQlAT3ZlcnJpZGUNCi0JCQkJCXB1YmxpYyB2b2lkIHN0YXJ0U3luY2hyb25pemluZygpIHsNCi0JCQkJCQlmYWlsKCJzdGFydFN5bmNocm9uaXppbmcgc2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gdGhpcyBjYXNlIik7DQotCQkJCQl9DQotCQkJCX07DQotCQkJfQ0KLQkJfTsNCi0JCWV4dGVuc2lvbi5hZGRMb2FkTGlzdGVuZXIobG9hZExpc3RlbmVyTW9jay5wcm94eSgpKTsNCi0JCXRyeSB7DQotCQkJZXh0ZW5zaW9uLmNyZWF0ZURPTShtb25pdG9yKTsJCQ0KLQkJCWZhaWwoIldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIG5vdCB0aHJvd24gYXogZXhwZWN0ZWQiKTsNCi0JCX0gY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIF8pIHsNCi0JCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFN0YXJ0U3luY2hyb25pemluZ0NhbGxlZElmTG9hZE5vdENhbmNlbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlmaW5hbCBib29sZWFuW10gc3RhcnRTeW5jQ2FsbGVkID0geyBmYWxzZSB9Ow0KLQkJZXh0ZW5zaW9uID0gbmV3IEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24oKSB7DQotCQkJQE92ZXJyaWRlDQotCQkJcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7IA0KLQkJCQlyZXR1cm4gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsKCkpIHsNCi0JCQkJCUBPdmVycmlkZQ0KLQkJCQkJcHVibGljIHZvaWQgc3RhcnRTeW5jaHJvbml6aW5nKCkgew0KLQkJCQkJCXN0YXJ0U3luY0NhbGxlZFswXSA9IHRydWU7DQotCQkJCQl9DQotCQkJCX07DQotCQkJfQ0KLQkJfTsNCi0JCWV4dGVuc2lvbi5jcmVhdGVET00obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCQlhc3NlcnRUcnVlKCJTdGFydCBzeW5jcm9uaXphdGlvbiB3YXMgbm90IHN0YXJ0ZWQgZXZlbiB0aGUgbG9hZCB3YXNhIG5vdCBjYW5jZWxlZCIsIHN0YXJ0U3luY0NhbGxlZFswXSk7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRE9NQmxvY2tzV2hlbkNhbGxlZCgpIHRocm93cyBFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIGJvb2xlYW5bXSBkb0xvYWRTdGFydGVkID0geyBmYWxzZSB9Ow0KLQkJZmluYWwgYm9vbGVhbltdIGRvTG9hZEZpbmlzaGVkID0geyBmYWxzZSB9Ow0KLQkJZXh0ZW5zaW9uID0gbmV3IEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24oKSB7DQotCQkJQE92ZXJyaWRlDQotCQkJcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7IA0KLQkJCQlyZXR1cm4gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsKCkpIHsNCi0JCQkJCUBPdmVycmlkZQ0KLQkJCQkJcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKGZpbmFsIE1hcDw/LCA/PiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJCQkJCWRvTG9hZFN0YXJ0ZWRbMF0gPSB0cnVlOw0KLQkJCQkJCXRyeSB7DQotCQkJCQkJCVRocmVhZC5zbGVlcCg0MDApOw0KLQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsNCi0JCQkJCQl9DQotCQkJCQkJc3VwZXIuZG9Mb2FkKG9wdGlvbnMpOw0KLQkJCQkJCWRvTG9hZEZpbmlzaGVkWzBdID0gdHJ1ZTsNCi0JCQkJCX0NCi0JCQkJfTsNCi0JCQl9DQotCQl9Ow0KLQkJbmV3IFRocmVhZCgpew0KLQkJCUBPdmVycmlkZQ0KLQkJICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCWV4dGVuc2lvbi5jcmVhdGVET00obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOw0KLQkJCQl9IGNhdGNoIChXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBlKSB7DQotCQkJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCQkJfQ0KLQkJICAgIH0NCi0JCX0uc3RhcnQoKTsNCi0JCUFzc2VydGlvbnMud2FpdEFzc2VydChuZXcgSVdhaXRDb25kaXRpb24oKSB7cHVibGljIGJvb2xlYW4gY2hlY2tDb25kaXRpb24oKSB7DQotCQkJcmV0dXJuIGRvTG9hZFN0YXJ0ZWRbMF07DQotCQl9fSwgIkxvYWRpbmcgZnJvbSBhbm90aGVyIHRocmVhZCBub3Qgc3RhcnRlZCIpOw0KLQkJDQotCQlleHRlbnNpb24uY3JlYXRlRE9NKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQkJYXNzZXJ0VHJ1ZSgiU3RhcnQgc3luY3Jvbml6YXRpb24gd2FzIG5vdCBzdGFydGVkIGV2ZW4gdGhlIGxvYWQgd2FzIG5vdCBjYW5jZWxlZCIsIGRvTG9hZEZpbmlzaGVkWzBdKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvUHJvamVjdEFkZGluZ1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvUHJvamVjdEFkZGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlOTgwZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL1Byb2plY3RBZGRpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0RWpiM1Byb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsNCi0NCi1wdWJsaWMgY2xhc3MgUHJvamVjdEFkZGluZ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLQkNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldDsNCi0JcHJpdmF0ZSBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JcHJpdmF0ZSBEb21VdGlsIHV0aWw7DQotCXByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByajM7Ow0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCXV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQkJamF2YU1vZGVsID0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQkJdGFyZ2V0ID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsKTsNCi0JCXRhcmdldC5sb2FkKG51bGwpOw0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJDQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdG9wU3luY2hyb25pemluZygpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X25ld1dzUHJvamVjdFN5bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRlc3RQcmozID0gbmV3IFRlc3RQcm9qZWN0KG5ldyBUZXN0RWpiM1Byb2plY3QoIlRlc3RFSkJQcm9qZWN0MyIpLmdldFByb2plY3QoKSk7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmozID0gdXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmozLmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCgiTmV3bHkgYWRkZWQgcHJvamVjdCBub3QgaW4gZG9tIix3c1ByajMpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X25ld05vbldzUHJvamVjdE5vdEFkZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdCgiVGVzdFByb2plY3QzIik7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmozID0gdXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmozLmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0TnVsbCgiTmV3bHkgYWRkZWQgcHJvamVjdCBpbiBkb20iLHdzUHJqMyk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfTm9uV3NQcm9qZWN0SWdub3JyZWRXaGVuQ2xvc2VkT3JSZW1vdmVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGVzdFByajMgPSBuZXcgVGVzdFByb2plY3QoIlRlc3RQcm9qZWN0MyIpOw0KLQkJdGVzdFByajMuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGYgPSB0ZXN0UHJqMy5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3Qubm9ud3Nwcm9qZWN0Iik7DQotCQlmaW5hbCBJVHlwZSB0eXBlID0gdGVzdFByajMuY3JlYXRlVHlwZShwZiwgIlNvbWVDbGFzcy5qYXZhIiwgInB1YmxpYyBjbGFzcyBTb21lQ2xhc3Mge30iKTsNCi0JCWZpbmFsIElGaWxlIGZpbGUgPSB0ZXN0UHJqMy5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHR5cGUuZ2V0UGF0aCgpKTsNCi0JCUlERS5vcGVuRWRpdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLCBmaWxlKTsNCi0JCXRlc3RQcmozLmdldFByb2plY3QoKS5jbG9zZShudWxsKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9vcGVuZWROb25Xc1Byb2plY3ROb3RBZGRlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGVzdFByajMgPSBuZXcgVGVzdFByb2plY3QoIlRlc3RFSkJQcm9qZWN0MyIpOw0KLQkJdGVzdFByajMuZ2V0UHJvamVjdCgpLmNsb3NlKG51bGwpOw0KLQkJdGVzdFByajMuZ2V0UHJvamVjdCgpLm9wZW4obnVsbCk7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmozID0gdXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmozLmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0TnVsbCgiTmV3bHkgYWRkZWQgcHJvamVjdCBub3QgaW4gZG9tIix3c1ByajMpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDFhODI0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvV29ya3NwYWNlQ1VGaW5kZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUNvbXBpbGF0aW9uVW5pdEZpbmRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklDb21waWxhdGlvblVuaXRIYW5kbGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSVByb2plY3RTZWxlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldvcmtzcGFjZUNVRmluZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlQ1VGaW5kZXJUZXN0IGV4dGVuZHMgQ29tcGlsYXRpb25Vbml0RmluZGVyQ29udHJhY3RUZXN0DQotew0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXRGaW5kZXIgY3JlYXRlVGFyZ2V0KCkNCi0Jew0KLQkJZmluYWwgSVByb2plY3RTZWxlY3RvcltdIHBzID0gbmV3IElQcm9qZWN0U2VsZWN0b3JbcHJvamVjdFNlbGVjdG9ycygpLnNpemUoKV07DQotCQlwcm9qZWN0U2VsZWN0b3JzKCkudG9BcnJheShwcyk7DQotCQlyZXR1cm4gbmV3IFdvcmtzcGFjZUNVRmluZGVyKGphdmFNb2RlbCgpLCBwcyk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RQcm9ncmVzc01vbml0b3JVcGRhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCU1vY2s8SVByb2dyZXNzTW9uaXRvcj4gbW9uaXRvciA9IG1vY2soSVByb2dyZXNzTW9uaXRvci5jbGFzcyk7DQotCQltb25pdG9yLnN0dWJzKCkubWV0aG9kKCJpc0NhbmNlbGVkIikud2lsbChyZXR1cm5WYWx1ZShmYWxzZSkpOw0KLQkJbW9uaXRvci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJiZWdpblRhc2siKTsNCi0JCW1vbml0b3IuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZG9uZSIpOw0KLQkJbW9uaXRvci5leHBlY3RzKGV4YWN0bHkoMikpLm1ldGhvZCgid29ya2VkIik7DQotCQkNCi0JCUlDb21waWxhdGlvblVuaXRGaW5kZXIgY3VGaW5kZXIgPSBzZXRVcEZvclByb2dyZXNzTW9uaXRvclRlc3RzKCk7DQotCQlNb2NrPElDb21waWxhdGlvblVuaXRIYW5kbGVyPiBjdUhhbmRsZXIgPSBtb2NrKElDb21waWxhdGlvblVuaXRIYW5kbGVyLmNsYXNzKTsNCi0JCWN1SGFuZGxlci5zdHVicygpLm1ldGhvZCgiaGFuZGxlIik7DQotCQljdUhhbmRsZXIuc3R1YnMoKS5tZXRob2QoInN0YXJ0ZWQiKTsNCi0JCWN1SGFuZGxlci5zdHVicygpLm1ldGhvZCgiZmluaXNoZWQiKTsNCi0JCQ0KLQkJY3VGaW5kZXIuZmluZChtb25pdG9yLnByb3h5KCksIGN1SGFuZGxlci5wcm94eSgpKTsJCQ0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENuYWNlbGF0aW9uUmVxdWVzdHNQcm9jZXNzZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlNb2NrPElQcm9ncmVzc01vbml0b3I+IG1vbml0b3IgPSBtb2NrKElQcm9ncmVzc01vbml0b3IuY2xhc3MpOw0KLQkJbW9uaXRvci5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJiZWdpblRhc2siKTsNCi0JCW1vbml0b3IuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZG9uZSIpOwkJDQotCQltb25pdG9yLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImlzQ2FuY2VsZWQiKS53aWxsKHJldHVyblZhbHVlKHRydWUpKTsNCi0JCQ0KLQkJSUNvbXBpbGF0aW9uVW5pdEZpbmRlciBjdUZpbmRlciA9IHNldFVwRm9yUHJvZ3Jlc3NNb25pdG9yVGVzdHMoKTsNCi0JCU1vY2s8SUNvbXBpbGF0aW9uVW5pdEhhbmRsZXI+IGN1SGFuZGxlciA9IG1vY2soSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIuY2xhc3MpOw0KLQkJY3VIYW5kbGVyLnN0dWJzKCkubWV0aG9kKCJoYW5kbGUiKTsNCi0JCWN1SGFuZGxlci5zdHVicygpLm1ldGhvZCgic3RhcnRlZCIpOw0KLQkJDQotCQl0cnkgew0KLQkJCWN1RmluZGVyLmZpbmQobW9uaXRvci5wcm94eSgpLCBjdUhhbmRsZXIucHJveHkoKSk7DQotCQkJZmFpbCgiU3luY2hyb25pemF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZSkgew0KLQkJCS8vIGV4cGVjdGVkDQotCQl9CQ0KLQl9DQotCQ0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXRGaW5kZXIgc2V0VXBGb3JQcm9ncmVzc01vbml0b3JUZXN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFRlc3RQcm9qZWN0IHByb2plY3QxID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQlwcm9qZWN0MS5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZjEgPSBwcm9qZWN0MS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QiKTsNCi0JCXByb2plY3QxLmNyZWF0ZVR5cGUocGYxLCAiQ3UxLmphdmEiLCAiY2xhc3MgQ3UxIHt9Iik7DQotCQlwcm9qZWN0MS5jcmVhdGVUeXBlKHBmMSwgIkN1Mi5qYXZhIiwgImNsYXNzIEN1MiB7fSIpOw0KLQkJDQotCQlJUHJvamVjdFNlbGVjdG9yIFtdIHNsZWN0b3JzID0gbmV3IElQcm9qZWN0U2VsZWN0b3JbXSB7DQotCQkJCW5ldyBJUHJvamVjdFNlbGVjdG9yKCkgew0KLQkJCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZShJSmF2YVByb2plY3QgcHJqKSB7DQotCQkJCQkJcmV0dXJuIHByb2plY3QxLmdldFByb2plY3QoKS5nZXROYW1lKCkuZXF1YWxzKHByai5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJfTsNCi0JCQkJDQotCQlyZXR1cm4gbmV3IFdvcmtzcGFjZUNVRmluZGVyKGphdmFNb2RlbCgpLCBzbGVjdG9ycyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2M2U1Njk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0Fubm90YXRpb25BZGFwdGVyRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25BZGFwdGVyRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXB1YmxpYyB2b2lkIHRlc3RJc0ZhY3RvcnlGb3JUeXBlT2JqZWN0KCkgDQotCXsNCi0JCWFzc2VydFRydWUoQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmlzRmFjdG9yeUZvclR5cGUoSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFkYXB0ZXIoKSANCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdzLCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJQWRhcHRlciBhZGFwdGVyID0gd3MuZUFkYXB0ZXJzKCkuZ2V0KDApOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlciBpbnN0YW5jZW9mIElBbm5vdGF0aW9uQWRhcHRlcik7DQotCQkNCi0JCUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3cywgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscygxLCB3cy5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQWJzdHJhY3RMb2NhdG9yc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQWJzdHJhY3RMb2NhdG9yc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDVlMTk2YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9pbXBsL0Fic3RyYWN0TG9jYXRvcnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdExvY2F0b3JzVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZBTFVFX09GRlNFVCA9IDEwOw0KLQkNCi0JcHJvdGVjdGVkIE1vY2s8SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9uOw0KLQlwcm90ZWN0ZWQgSVBhcmFtVmFsdWVQYWlyIHBhcmFtMTsNCi0JcHJvdGVjdGVkIElQYXJhbVZhbHVlUGFpciBwYXJhbTI7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlhbm5vdGF0aW9uID0gbW9jayhJQW5ub3RhdGlvbi5jbGFzcyk7DQotCQlhbm5vdGF0aW9uLnN0dWJzKCkubWV0aG9kKCJnZXRMb2NhdG9yIikud2lsbChyZXR1cm5WYWx1ZShjcmVhdGVMb2NhdG9yKDEsIDExKSkpOw0KLQkJDQotCQlwYXJhbTEgPSBjcmVhdGVQYXJhbVZhbHVlKCJwYXJhbTEiLCAyMSwgMzEpOw0KLQkJcGFyYW0yID0gY3JlYXRlUGFyYW1WYWx1ZSgicGFyYW0yIiwgMjIsIDMyKTsNCi0JCQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFpcnMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYWlycy5hZGQocGFyYW0xKTsNCi0JCXBhaXJzLmFkZChwYXJhbTIpOw0KLQkJYW5ub3RhdGlvbi5zdHVicygpLm1ldGhvZCgiZ2V0UGFyYW1WYWx1ZVBhaXJzIikud2lsbChyZXR1cm5WYWx1ZShwYWlycykpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVBhcmFtVmFsdWVQYWlyIGNyZWF0ZVBhcmFtVmFsdWUoU3RyaW5nIG5hbWUsIGludCBzdGFydFBvcywgaW50IGxlbmdodCkNCi0Jew0KLQkJTW9jazxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtID0gbW9jayhJUGFyYW1WYWx1ZVBhaXIuY2xhc3MpOw0KLQkJcGFyYW0uc3R1YnMoKS5tZXRob2QoImdldFBhcmFtIikud2lsbChyZXR1cm5WYWx1ZShuYW1lKSk7DQotCQlwYXJhbS5zdHVicygpLm1ldGhvZCgiZ2V0TG9jYXRvciIpLndpbGwocmV0dXJuVmFsdWUoY3JlYXRlTG9jYXRvcihzdGFydFBvcywgbGVuZ2h0KSkpOw0KLQkJTW9jazxJVmFsdWU+IHZhbHVlID0gbW9jayhJVmFsdWUuY2xhc3MpOw0KLQkJdmFsdWUuc3R1YnMoKS5tZXRob2QoImdldExvY2F0b3IiKS53aWxsKHJldHVyblZhbHVlKGNyZWF0ZUxvY2F0b3Ioc3RhcnRQb3MgKyBWQUxVRV9PRkZTRVQsIGxlbmdodCArIFZBTFVFX09GRlNFVCkpKTsNCi0JCXBhcmFtLnN0dWJzKCkubWV0aG9kKCJnZXRWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUodmFsdWUucHJveHkoKSkpOwkJDQotCQkNCi0JCXJldHVybiBwYXJhbS5wcm94eSgpOw0KLQl9DQotDQotCXByb3RlY3RlZCBJTG9jYXRvciBjcmVhdGVMb2NhdG9yKGludCBzdGFydFBvcywgaW50IGxlbmd0aCkNCi0Jew0KLQkJTW9jazxJTG9jYXRvcj4gbG9jYXRvciA9IG1vY2soSUxvY2F0b3IuY2xhc3MpOw0KLQkJbG9jYXRvci5zdHVicygpLm1ldGhvZCgiZ2V0TGVuZ3RoIikud2lsbChyZXR1cm5WYWx1ZShsZW5ndGgpKTsNCi0JCWxvY2F0b3Iuc3R1YnMoKS5tZXRob2QoImdldFN0YXJ0UG9zaXRpb24iKS53aWxsKHJldHVyblZhbHVlKHN0YXJ0UG9zKSk7DQotCQkNCi0JCXJldHVybiBsb2NhdG9yLnByb3h5KCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9Bbm5vdGF0aW9uQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQW5ub3RhdGlvbkFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJlNTE5NzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9Bbm5vdGF0aW9uQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsLkFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfQU5OT1RBVElPTjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQWRhcHRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdExvY2F0b3JzVGVzdCANCi17DQotDQotCXByaXZhdGUgQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlcjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCXN1cGVyLnNldFVwKCk7DQotCQlhZGFwdGVyID0gbmV3IEFubm90YXRpb25BZGFwdGVyKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEFkZEdldEFubm90YXRpb25Mb2NhdGlvbnMoKSANCi0Jew0KLQkJYWRhcHRlci5hZGRBbm5vdGF0aW9uKFdTX0FOTk9UQVRJT04sIGFubm90YXRpb24ucHJveHkoKSk7DQotCQlhbm5vdGF0aW9uLnN0dWJzKCkubWV0aG9kKCJnZXRMb2NhdG9yIikud2lsbChyZXR1cm5WYWx1ZShjcmVhdGVMb2NhdG9yKDEwMCwgMTEwKSkpOw0KLQkJYWRhcHRlci5hZGRBbm5vdGF0aW9uKFNCX0FOTk9UQVRJT04sIGFubm90YXRpb24ucHJveHkoKSk7DQotCQlJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKFdTX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0Tm90TnVsbCgiQW5ub3RhdGlvbiBhZGFwdGVyIG5vdCBhZGRlZCIsIGFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKDEwMCwgYW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQ0KLQkJYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihTQl9BTk5PVEFUSU9OKTsNCi0JCWFzc2VydE5vdE51bGwoIkFubm90YXRpb24gYWRhcHRlciBub3QgYWRkZWQiLCBhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygxMDAsIGFubm90YXRpb24uZ2V0TG9jYXRvcigpLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCQ0KLQkJYWRhcHRlci5hZGRBbm5vdGF0aW9uKFdTX0FOTk9UQVRJT04sIG51bGwpOw0KLQkJYW5ub3RhdGlvbj0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKFdTX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0TnVsbCgiQW5ub3RhdGlvbiBhZGFwdGVyIG5vdCBjbGVhcmVkIiwgYW5ub3RhdGlvbik7CQkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNBZGFwdGVyRm9yVHlwZSgpIA0KLQl7DQotCQlhc3NlcnRUcnVlKCJBZGFwdGVyIHJlcG9ydHMgdGhhdCBpdCBpcyBub3QgZm9yIElMb2NhdG9yQWRhcHRlciIsIGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvZGVmYXVsdHMvTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvZGVmYXVsdHMvTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4ZjcxZTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2RlZmF1bHRzL01ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzLk1ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMuUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciBtZXRob2QgZGVmYXVsdCB2YWx1ZXMgYWRhcHRlcg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwcml2YXRlIElXZWJNZXRob2Qgd2ViTWV0aG9kOw0KLQlwcml2YXRlIElQcm9wZXJ0eURlZmF1bHRzIGRlZmF1bHRzOw0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKSANCi0Jew0KLQkJd2ViTWV0aG9kID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJd2ViTWV0aG9kLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgIm15TWV0aG9kKCkiKTsNCi0JCWRlZmF1bHRzID0gKElQcm9wZXJ0eURlZmF1bHRzKVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3ZWJNZXRob2QsIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZE5hbWUoKSANCi0Jew0KLQkJYXNzZXJ0RXF1YWxzKCJteU1ldGhvZCIsIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBZGFwdGVkT25jZSgpDQotCXsNCi0JCUlQcm9wZXJ0eURlZmF1bHRzIGFkYXB0ZXIgPSAoSVByb3BlcnR5RGVmYXVsdHMpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYk1ldGhvZCwgSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyIGluc3RhbmNlb2YgTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdlYk1ldGhvZC5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRzLCBhZGFwdGVyKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhMjY3ZjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1BhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5kZWZhdWx0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzLlBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMuUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgSVdlYlBhcmFtfSBwcm9wZXJ0aWVzIGRlZmF1bHQgdmFsdWVzDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSVdlYk1ldGhvZCB3ZWJNZXRob2Q7DQotCXByaXZhdGUgSVdlYlBhcmFtIHdlYlBhcmFtOw0KLQlwcml2YXRlIElQcm9wZXJ0eURlZmF1bHRzIGRlZmF1bHRzOw0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKSANCi0Jew0KLQkJd2ViTWV0aG9kID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJd2ViTWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCk7DQotCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UuTElURVJBTCk7DQotCQl3ZWJNZXRob2Quc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQpOw0KLQkJDQotCQl3ZWJQYXJhbSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJQYXJhbSgpOw0KLQkJd2ViUGFyYW0uZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAibXlQYXJhbSIpOw0KLQkJDQotCQlJV2ViUGFyYW0gZHVtbXkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViUGFyYW0oKTsNCi0JCWR1bW15LmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgImR1bW15Iik7DQotCQkNCi0JCXdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKGR1bW15KTsNCi0JCXdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKHdlYlBhcmFtKTsNCi0JCQ0KLQkJZGVmYXVsdHMgPSAoSVByb3BlcnR5RGVmYXVsdHMpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYlBhcmFtLCBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lRGVmYXVsdFZhbHVlKCkgDQotCXsNCi0JCXdlYlBhcmFtLnNldE5hbWUoInRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygiYXJnMSIsIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJ0TmFtZURlZmF1bHRWYWx1ZSgpDQotCXsNCi0JCXdlYlBhcmFtLnNldFBhcnROYW1lKCJ0ZXN0Iik7DQotCQlhc3NlcnRFcXVhbHMoImFyZzEiLCBkZWZhdWx0cy5nZXREZWZhdWx0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJ0TmFtZU1ldGhvZFBhcmFtU3R5bGVCYXJlKCkNCi0Jew0KLQkJd2ViTWV0aG9kLnNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKTsNCi0JCXdlYk1ldGhvZC5zZXROYW1lKCJ0ZXN0Iik7DQotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBkZWZhdWx0cy5nZXREZWZhdWx0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0TlNEZWZhdWx0VmFsdWUoKQ0KLQl7DQotCQl3ZWJQYXJhbS5zZXRUYXJnZXROYW1lc3BhY2UoInRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygiIiwgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldE5TUGFyYW1JbkhlYWRlckRlZmF1bHRWYWx1ZSgpDQotCXsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJc2VpLnNldFRhcmdldE5hbWVzcGFjZSgiaHR0cDovL3Rlc3QiKTsNCi0JCQ0KLQkJc2VpLmdldFdlYk1ldGhvZHMoKS5hZGQod2ViTWV0aG9kKTsNCi0JCQ0KLQkJd2ViUGFyYW0uc2V0SGVhZGVyKHRydWUpOw0KLQkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdCIsIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSk7CQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0cy5nZXREZWZhdWx0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fSEVBREVSKSk7CQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0S2luZERlZmF1bHRWYWx1ZSgpIA0KLQl7DQotCQlhc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLklOLCBkZWZhdWx0cy5nZXREZWZhdWx0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fS0lORCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRlZE9uY2UoKQ0KLQl7DQotCQlJUHJvcGVydHlEZWZhdWx0cyBhZGFwdGVyID0gKElQcm9wZXJ0eURlZmF1bHRzKVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3ZWJQYXJhbSwgSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyIGluc3RhbmNlb2YgUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoMSwgd2ViUGFyYW0uZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscyhkZWZhdWx0cywgYWRhcHRlcik7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjY0OWE5OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvZGVmYXVsdHMvU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMuUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMuU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXI7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBkZWZhdWx0IHByb3BlcnRpZXMgdmFsdWVzIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpOw0KLQlwcml2YXRlIElQcm9wZXJ0eURlZmF1bHRzIGRlZmF1bHRzOw0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQlzZWkuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAiY29tLnNhcC50ZXN0LlNlaSIpOw0KLQkJZGVmYXVsdHMgPSAoSVByb3BlcnR5RGVmYXVsdHMpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHNlaSwgSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lRGVmYXVsdFZhbHVlKCkNCi0Jew0KLQkJc2VpLnNldE5hbWUoIlRlc3QiKTsNCi0JCWFzc2VydEVxdWFscygiU2VpIiwgZGVmYXVsdHMuZ2V0RGVmYXVsdChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXROYW1lc3BhY2VEZWZhdWx0VmFsdWUoKQ0KLQl7DQotCQlzZWkuc2V0VGFyZ2V0TmFtZXNwYWNlKCJ0ZXN0Iik7DQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9zYXAuY29tL3Rlc3QvIiwgIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFkYXB0ZWRPbmNlKCkNCi0Jew0KLQkJSVByb3BlcnR5RGVmYXVsdHMgYWRhcHRlciA9IChJUHJvcGVydHlEZWZhdWx0cylQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoc2VpLCBJUHJvcGVydHlEZWZhdWx0cy5jbGFzcyk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIgaW5zdGFuY2VvZiBTZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlcik7DQotCQlhc3NlcnRFcXVhbHMoMSwgc2VpLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdHMsIGFkYXB0ZXIpOw0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2UvZGVmYXVsdHMvV3NQcm9wZXJ0eURlZmF1bHRzQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNDgyZjQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgSVdlYlNlcnZpY2V9IGRlZmF1bHQgdmFsdWVzIGNhbGN1bGF0aW9uDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2U7DQotCXByaXZhdGUgSVByb3BlcnR5RGVmYXVsdHMgZGVmYXVsdHM7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsNCi0JCXdlYlNlcnZpY2UgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJd2ViU2VydmljZS5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sICJjb20uc2FwLnRlc3QuTXlXcyIpOw0KLQkJZGVmYXVsdHMgPSAoSVByb3BlcnR5RGVmYXVsdHMpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYlNlcnZpY2UsIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZURlZmF1bHRWYWx1ZSgpDQotCXsNCi0JCXdlYlNlcnZpY2Uuc2V0TmFtZSgiVGVzdCIpOw0KLQkJYXNzZXJ0RXF1YWxzKCJNeVdzU2VydmljZSIsIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RQb3J0TmFtZURlZmF1bHRWYWx1ZSgpDQotCXsNCi0JCXdlYlNlcnZpY2Uuc2V0UG9ydE5hbWUoIlRlc3RQb3J0TmFtZSIpOw0KLQkJYXNzZXJ0RXF1YWxzKCJNeVdzUG9ydCIsICBkZWZhdWx0cy5nZXREZWZhdWx0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19QT1JUX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldE5hbWVzcGFjZURlZmF1bHRWYWx1ZSgpDQotCXsNCi0JCXdlYlNlcnZpY2Uuc2V0VGFyZ2V0TmFtZXNwYWNlKCJ0ZXN0Iik7DQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9zYXAuY29tL3Rlc3QvIiwgIGRlZmF1bHRzLmdldERlZmF1bHQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFkYXB0ZWRPbmNlKCkNCi0Jew0KLQkJSVByb3BlcnR5RGVmYXVsdHMgYWRhcHRlciA9IChJUHJvcGVydHlEZWZhdWx0cylQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViU2VydmljZSwgSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyIGluc3RhbmNlb2YgV3NQcm9wZXJ0eURlZmF1bHRzQWRhcHRlcik7DQotCQlhc3NlcnRFcXVhbHMoMSwgd2ViU2VydmljZS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRzLCBhZGFwdGVyKTsNCi0JfQkJDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL0Fic3RyYWN0U2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiN2EzMGJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL0Fic3RyYWN0U2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuV3NTZXJpYWxpemVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFdzU2VyaWFsaXplckFkYXB0ZXJ9IGNsYXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlclRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UgDQotew0KLQlwcml2YXRlIFRlc3RXc1NlcmlhbGl6ZXJBZGFwdGVyIGFkYXB0ZXI7DQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZTsgDQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlNb2NrPElKYXZhTW9kZWw+IGphdmFNb2RlbE1vY2sgPSBtb2NrKElKYXZhTW9kZWwuY2xhc3MpOw0KLQkJcmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWxNb2NrLnByb3h5KCkpOw0KLQkJYWRhcHRlciA9IG5ldyBUZXN0V3NTZXJpYWxpemVyQWRhcHRlcihudWxsLCBmYWxzZSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RXc1NlcmlhbGl6ZXJBZGFwdGVyKCkgDQotCXsNCi0JCXRyeSB7DQotCQkJbmV3IFdzU2VyaWFsaXplckFkYXB0ZXIobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXykgew0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5Q2hhbmdlZE5vdGlmaWNhdGlvbkVkaXRFbmFibGVkT25TZXQoKSANCi0Jew0KLQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQlNb2NrPE5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9uTW9jayA9IG1vY2soTm90aWZpY2F0aW9uLmNsYXNzKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiaXNUb3VjaCIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldEV2ZW50VHlwZSIpLndpbGwocmV0dXJuVmFsdWUoTm90aWZpY2F0aW9uLlNFVCkpOw0KLQkJDQotCQlhZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5zYXZlQ2FsbGVkKTsJCQ0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5vdGlmeUNoYW5nZWROb3RpZmljYXRpb25FZGl0RW5hYmxlZE9uVW5zZXQoKSANCi0Jew0KLQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQlNb2NrPE5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9uTW9jayA9IG1vY2soTm90aWZpY2F0aW9uLmNsYXNzKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiaXNUb3VjaCIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldEV2ZW50VHlwZSIpLndpbGwocmV0dXJuVmFsdWUoTm90aWZpY2F0aW9uLlVOU0VUKSk7DQotCQkNCi0JCWFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLnNhdmVDYWxsZWQpOwkJDQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5Q2hhbmdlZE5vdGlmaWNhdGlvbkVkaXRFbmFibGVkT25BZGQoKSANCi0Jew0KLQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQlNb2NrPE5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9uTW9jayA9IG1vY2soTm90aWZpY2F0aW9uLmNsYXNzKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiaXNUb3VjaCIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldEV2ZW50VHlwZSIpLndpbGwocmV0dXJuVmFsdWUoTm90aWZpY2F0aW9uLkFERCkpOw0KLQkJDQotCQlhZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuc2F2ZUNhbGxlZCk7CQkNCi0JfQkJDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5Q2hhbmdlZE5vdGlmaWNhdGlvbk9iamVjdFRvdWNoZWQoKSANCi0Jew0KLQkJcmVzb3VyY2UuZW5hYmxlU2F2aW5nKCk7DQotCQlNb2NrPE5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9uTW9jayA9IG1vY2soTm90aWZpY2F0aW9uLmNsYXNzKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiaXNUb3VjaCIpLndpbGwocmV0dXJuVmFsdWUodHJ1ZSkpOw0KLQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbk1vY2sucHJveHkoKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLnNhdmVDYWxsZWQpOwkJDQotCX0JCQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5Q2hhbmdlZE5vdGlmaWNhdGlvbkVkaXREaXNhYmxlZCgpIA0KLQl7DQotCQlyZXNvdXJjZS5kaXNhYmxlU2F2aW5nKCk7DQotCQlNb2NrPE5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9uTW9jayA9IG1vY2soTm90aWZpY2F0aW9uLmNsYXNzKTsNCi0JCWFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5zYXZlQ2FsbGVkKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tTdHJpbmdWYWx1ZSgpDQotCXsNCi0JCUlXZWJTZXJ2aWNlIHdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCVRlc3RXc1NlcmlhbGl6ZXJBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgVGVzdFdzU2VyaWFsaXplckFkYXB0ZXIod3MsIHRydWUpOw0KLQkJDQotCQlNb2NrPE5vdGlmaWNhdGlvbj4gbXNnID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXRGZWF0dXJlIikud2lsbChyZXR1cm5WYWx1ZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCW1zZy5zdHVicygpLm1ldGhvZCgiZ2V0T2xkU3RyaW5nVmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJvbGRWYWx1ZSIpKTsNCi0JCW1zZy5zdHVicygpLm1ldGhvZCgiZ2V0TmV3U3RyaW5nVmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJuZXdWYWx1ZSIpKTsJCQ0KLQkJDQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuY2hlY2tWYWx1ZShtc2cucHJveHkoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJuZXdWYWx1ZSIsIHdzLmdldE5hbWUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDaGVja1N0cmluZ1ZhbHVlSW52YWxpZFZhbHVlcygpDQotCXsNCi0JCUlXZWJTZXJ2aWNlIHdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCVRlc3RXc1NlcmlhbGl6ZXJBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgVGVzdFdzU2VyaWFsaXplckFkYXB0ZXIod3MsIHRydWUpOw0KLQkJDQotCQlNb2NrPE5vdGlmaWNhdGlvbj4gbXNnID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXRGZWF0dXJlIikud2lsbChyZXR1cm5WYWx1ZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCW1zZy5zdHVicygpLm1ldGhvZCgiZ2V0T2xkVmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCJvbGRWYWx1ZSIpKTsNCi0JCQ0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXROZXdTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5jaGVja1ZhbHVlKG1zZy5wcm94eSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoIm9sZFZhbHVlIiwgd3MuZ2V0TmFtZSgpKTsNCi0JCW1zZy5zdHVicygpLm1ldGhvZCgiZ2V0TmV3U3RyaW5nVmFsdWUiKS53aWxsKHJldHVyblZhbHVlKCIiKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmNoZWNrVmFsdWUobXNnLnByb3h5KCkpKTsNCi0JCWFzc2VydEVxdWFscygib2xkVmFsdWUiLCB3cy5nZXROYW1lKCkpOw0KLQkJbXNnLnN0dWJzKCkubWV0aG9kKCJnZXROZXdTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIiAiKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmNoZWNrVmFsdWUobXNnLnByb3h5KCkpKTsNCi0JCWFzc2VydEVxdWFscygib2xkVmFsdWUiLCB3cy5nZXROYW1lKCkpOwkJDQotCQltc2cuc3R1YnMoKS5tZXRob2QoImdldE5ld1N0cmluZ1ZhbHVlIikud2lsbChyZXR1cm5WYWx1ZSgiIG9sZFZhbHVlICIpKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5jaGVja1ZhbHVlKG1zZy5wcm94eSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoIm9sZFZhbHVlIiwgd3MuZ2V0TmFtZSgpKTsJCQkJDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdElzQWRhcHRlckZvclR5cGVPYmplY3QoKSANCi0Jew0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUoSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUoTm90aWZpY2F0aW9uLmNsYXNzKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWxsZWRGb3JSZXF1aXJlZEFubm90YXRpb24oKQ0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiaXNUb3VjaCIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldEV2ZW50VHlwZSIpLndpbGwocmV0dXJuVmFsdWUoTm90aWZpY2F0aW9uLlVOU0VUKSk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXROZXdTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoInRlc3QiKSk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXRPbGRWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIm9sZFZhbHVlIikpOwkNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldEZlYXR1cmUiKS53aWxsKHJldHVyblZhbHVlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJTW9jazxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubiA9IG1vY2soSUFubm90YXRpb24uY2xhc3MpOw0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQYXJhbVZhbHVlUGFpcnMiKS53aWxsKHJldHVyblZhbHVlKG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKSkpOw0KLQkJDQotCQlUZXN0U2F2aW5nV3NTZXJpYWxpemVyQWRhcHRlciBzYXZlQWRhcHRlciA9IG5ldyBUZXN0U2F2aW5nV3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSwgdHJ1ZSwgYW5uLnByb3h5KCkpOw0KLQkJc2F2ZUFkYXB0ZXIuc2V0VGFyZ2V0KERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCkpOw0KLQkJc2F2ZUFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb25Nb2NrLnByb3h5KCkpOw0KLQkJYXNzZXJ0VHJ1ZShzYXZlQWRhcHRlci5hbm5Xcml0ZXIudXBkYXRlQ2FsbGVkKTsNCi0JCWFzc2VydEZhbHNlKHNhdmVBZGFwdGVyLmFubldyaXRlci5yZW1vdmVDYWxsZWQpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWxsZWRGb3JOb25FbXB0eUFubm90YXRpb24oKQ0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiaXNUb3VjaCIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldEV2ZW50VHlwZSIpLndpbGwocmV0dXJuVmFsdWUoTm90aWZpY2F0aW9uLlVOU0VUKSk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXROZXdTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoInRlc3QiKSk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXRPbGRWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIm9sZFZhbHVlIikpOwkNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldEZlYXR1cmUiKS53aWxsKHJldHVyblZhbHVlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJTW9jazxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubiA9IG1vY2soSUFubm90YXRpb24uY2xhc3MpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1zID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJTW9jazxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtID0gbW9jayhJUGFyYW1WYWx1ZVBhaXIuY2xhc3MpOw0KLQkJcGFyYW1zLmFkZChwYXJhbS5wcm94eSgpKTsNCi0JCWFubi5zdHVicygpLm1ldGhvZCgiZ2V0UGFyYW1WYWx1ZVBhaXJzIikud2lsbChyZXR1cm5WYWx1ZShwYXJhbXMpKTsNCi0JCQ0KLQkJVGVzdFNhdmluZ1dzU2VyaWFsaXplckFkYXB0ZXIgc2F2ZUFkYXB0ZXIgPSBuZXcgVGVzdFNhdmluZ1dzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UsIGZhbHNlLCBhbm4ucHJveHkoKSk7DQotCQlzYXZlQWRhcHRlci5zZXRUYXJnZXQoRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKSk7DQotCQlzYXZlQWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbk1vY2sucHJveHkoKSk7DQotCQlhc3NlcnRUcnVlKHNhdmVBZGFwdGVyLmFubldyaXRlci51cGRhdGVDYWxsZWQpOw0KLQkJYXNzZXJ0RmFsc2Uoc2F2ZUFkYXB0ZXIuYW5uV3JpdGVyLnJlbW92ZUNhbGxlZCk7CQkNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDYWxsZWRGb3JOb3RSZXF1aXJlZEFubm90YXRpb24oKQ0KLQl7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCU1vY2s8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25Nb2NrID0gbW9jayhOb3RpZmljYXRpb24uY2xhc3MpOw0KLQkJbm90aWZpY2F0aW9uTW9jay5zdHVicygpLm1ldGhvZCgiaXNUb3VjaCIpLndpbGwocmV0dXJuVmFsdWUoZmFsc2UpKTsNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldEV2ZW50VHlwZSIpLndpbGwocmV0dXJuVmFsdWUoTm90aWZpY2F0aW9uLlVOU0VUKSk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXROZXdTdHJpbmdWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoInRlc3QiKSk7DQotCQlub3RpZmljYXRpb25Nb2NrLnN0dWJzKCkubWV0aG9kKCJnZXRPbGRWYWx1ZSIpLndpbGwocmV0dXJuVmFsdWUoIm9sZFZhbHVlIikpOwkNCi0JCW5vdGlmaWNhdGlvbk1vY2suc3R1YnMoKS5tZXRob2QoImdldEZlYXR1cmUiKS53aWxsKHJldHVyblZhbHVlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJTW9jazxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubiA9IG1vY2soSUFubm90YXRpb24uY2xhc3MpOw0KLQkJYW5uLnN0dWJzKCkubWV0aG9kKCJnZXRQYXJhbVZhbHVlUGFpcnMiKS53aWxsKHJldHVyblZhbHVlKG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKSkpOw0KLQkJDQotCQlUZXN0U2F2aW5nV3NTZXJpYWxpemVyQWRhcHRlciBzYXZlQWRhcHRlciA9IG5ldyBUZXN0U2F2aW5nV3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSwgZmFsc2UsIGFubi5wcm94eSgpKTsNCi0JCXNhdmVBZGFwdGVyLnNldFRhcmdldChEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpKTsNCi0JCXNhdmVBZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JCWFzc2VydEZhbHNlKHNhdmVBZGFwdGVyLmFubldyaXRlci51cGRhdGVDYWxsZWQpOw0KLQkJYXNzZXJ0VHJ1ZShzYXZlQWRhcHRlci5hbm5Xcml0ZXIucmVtb3ZlQ2FsbGVkKTsJCQ0KLQl9DQotCQkNCi0JDQotCXByb3RlY3RlZCBjbGFzcyBUZXN0V3NTZXJpYWxpemVyQWRhcHRlciBleHRlbmRzIEFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXINCi0Jew0KLQkJcHVibGljIGJvb2xlYW4gc2F2ZUNhbGxlZDsNCi0JCQ0KLQkJcHJpdmF0ZSBib29sZWFuIGRvQ2hlY2s7DQotCQkNCi0JCXByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7DQotCQkJDQotCQlwdWJsaWMgVGVzdFdzU2VyaWFsaXplckFkYXB0ZXIoZmluYWwgSVdlYlNlcnZpY2Ugd3MsIGJvb2xlYW4gZG9DaGVjaykgew0KLQkJCXN1cGVyKHJlc291cmNlKTsNCi0JCQl0aGlzLndzID0gd3M7DQotCQkJdGhpcy5kb0NoZWNrID0gZG9DaGVjazsNCi0JCX0JCQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgdm9pZCBzYXZlKE5vdGlmaWNhdGlvbiBtc2cpIHsNCi0JCQlzYXZlQ2FsbGVkID0gdHJ1ZTsNCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHVibGljIGJvb2xlYW4gY2hlY2tWYWx1ZShOb3RpZmljYXRpb24gbXNnKSANCi0JCXsNCi0JCQlpZighZG9DaGVjaykgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQkJDQotCQkJcmV0dXJuIHN1cGVyLmNoZWNrVmFsdWUobXNnKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgRU9iamVjdCBnZXRUYXJnZXQoKSB7DQotCQkJcmV0dXJuIHdzOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGNsYXNzIFRlc3RTYXZpbmdXc1NlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLQl7DQotCQlib29sZWFuIGFublJlcXVpcmVkOw0KLQkJTXlBbm5vdGF0aW9uV3JpdGVyIGFubldyaXRlciA9IG5ldyBNeUFubm90YXRpb25Xcml0ZXIoKTsNCi0JCUlBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubjsNCi0JCQ0KLQkJcHVibGljIFRlc3RTYXZpbmdXc1NlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gYW5uUmVxdWlyZWQsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubikgew0KLQkJCXN1cGVyKHJlc291cmNlKTsNCi0JCQl0aGlzLmFublJlcXVpcmVkID0gYW5uUmVxdWlyZWQ7DQotCQkJdGhpcy5hbm4gPSBhbm47DQotCQl9DQotDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCQkJcmV0dXJuIGFubjsNCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSB7DQotCQkJcmV0dXJuIGFublJlcXVpcmVkOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uV3JpdGVyIGdldEFubm90YXRpb25Xcml0ZXIoKSB7DQotCQkJcmV0dXJuIGFubldyaXRlcjsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGNsYXNzIE15QW5ub3RhdGlvbldyaXRlciBleHRlbmRzIEFubm90YXRpb25Xcml0ZXINCi0Jew0KLQkJYm9vbGVhbiByZW1vdmVDYWxsZWQ7DQotCQlib29sZWFuIHVwZGF0ZUNhbGxlZDsNCi0JCQ0KLQkJcHVibGljIHZvaWQgY2xlYXIoKQ0KLQkJew0KLQkJCXJlbW92ZUNhbGxlZCA9IGZhbHNlOw0KLQkJCXVwZGF0ZUNhbGxlZCA9IGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCB1cGRhdGUoZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbikgew0KLQkJCXVwZGF0ZUNhbGxlZCA9IHRydWU7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHVibGljIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHJlbW92ZShmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uKSB7DQotCQkJcmVtb3ZlQ2FsbGVkID0gdHJ1ZTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9NZXRob2RTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZDNjNDlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLk1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT047DQotDQotcHVibGljIGNsYXNzIE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyVGVzdCBleHRlbmRzIFNlcmlhbGl6ZXJBZGFwdGVyVGVzdEZpeHR1cmUgDQotew0KLQlwcml2YXRlIElXZWJNZXRob2Qgd2ViTWV0aG9kMTsNCi0JcHJpdmF0ZSBJTWV0aG9kIG1ldGhvZDE7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc3VwZXIuc2V0VXAoKTsNCi0JDQotCQlyZXNvdXJjZS5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCW1ldGhvZDEgPSBzZWlUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgdGVzdDEoKTsiLCBudWxsLCB0cnVlLCBudWxsKTsNCi0JCXdlYk1ldGhvZDEgPSBzZWkuZ2V0V2ViTWV0aG9kcygpLmdldCgwKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbkRlZmF1bHRWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCU15TWV0aG9kU2VyaWFsaXplckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNeU1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlLCB3ZWJNZXRob2QxKTsNCi0JCUlBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7DQotCQlhc3NlcnRFcXVhbHMoMCwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fTkFNRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbk5vbkRlZmF1bHRWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsJCQ0KLQkJcmVzb3VyY2UuZGlzYWJsZVNhdmluZygpOw0KLQkJd2ViTWV0aG9kMS5zZXROYW1lKCJjaGFuZ2VkIik7DQotCQl3ZWJNZXRob2QxLnNldEV4Y2x1ZGVkKHRydWUpOw0KLQkJTXlNZXRob2RTZXJpYWxpemVyQWRhcHRlciBhZGFwdGVyID0gbmV3IE15TWV0aG9kU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UsIHdlYk1ldGhvZDEpOw0KLQkJSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygyLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoImNoYW5nZWQiLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fTkFNRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscygidHJ1ZSIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTUFubm90YXRpb25GZWF0dXJlcy5XTV9FWENMVURFRF9BVFRSSUJVVEUpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXdlYk1ldGhvZDEuc2V0TmFtZSgiY2hhbmdlZE9wZXJhdGlvbiIpOw0KLQkJZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihzZWlUeXBlKTsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChtZXRob2QxLCBXTV9BTk5PVEFUSU9OKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7DQotCQlhc3NlcnRFcXVhbHMoImNoYW5nZWRPcGVyYXRpb24iLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fTkFNRV9BVFRSSUJVVEUpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFubm90YXRpb25FbXB0eU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXdlYk1ldGhvZDEuc2V0TmFtZSgibWV0aG9kMSIpOw0KLQkJd2ViTWV0aG9kMS5zZXROYW1lKG51bGwpOw0KLQkJZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihzZWlUeXBlKTsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChtZXRob2QxLCBXTV9BTk5PVEFUSU9OKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7DQotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDEiLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fTkFNRV9BVFRSSUJVVEUpKTsJCQkNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGNsYXNzIE15TWV0aG9kU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RTZXJpYWxpemVyQWRhcHRlcg0KLQl7DQotCQlwdWJsaWMgTXlNZXRob2RTZXJpYWxpemVyQWRhcHRlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlLCBJV2ViTWV0aG9kIHdlYk1ldGhvZCkgew0KLQkJCXN1cGVyKHJlc291cmNlKTsNCi0JCQlzZXRUYXJnZXQod2ViTWV0aG9kKTsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQkJew0KLQkJCXJldHVybiBzdXBlci5nZXRBbm5vdGF0aW9uKCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDU5OWU5ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLlBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLQ0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlclRlc3QgZXh0ZW5kcyBTZXJpYWxpemVyQWRhcHRlclRlc3RGaXh0dXJlDQotew0KLQlwcml2YXRlIE15UGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIgYWRhcHRlcjsNCi0JcHJpdmF0ZSBJTWV0aG9kIG1ldGhvZDsgDQotCXByaXZhdGUgSVdlYk1ldGhvZCB3c01ldGhvZDsNCi0JcHJpdmF0ZSBJV2ViUGFyYW0gd2ViUGFyYW07IA0KLQlwcml2YXRlIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcjsNCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzdXBlci5zZXRVcCgpOw0KLQkJcmVzb3VyY2Uuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlhZGFwdGVyID0gbmV3IE15UGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpOw0KLQkJbWV0aG9kID0gc2VpVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG1ldGhvZChpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3c01ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWksIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJd2ViUGFyYW0gPSB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApOw0KLQkJYWRhcHRlci5zZXRUYXJnZXQod2ViUGFyYW0pOw0KLQkJcmVzb3VyY2UuZGlzYWJsZVNhdmluZygpOw0KLQkJaW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihzZWlUeXBlKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25LaW5kKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQkvLyBJTiBjYXNlDQotCQl3ZWJQYXJhbS5zZXRLaW5kKFdlYlBhcmFtS2luZC5JTik7DQotCQlJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQkNCi0JCS8vIElOT1VUIGNhc2UNCi0JCXdlYlBhcmFtLnNldEtpbmQoV2ViUGFyYW1LaW5kLklOT1VUKTsNCi0JCWFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlID0gYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscygibW9kZSIsIHBhcmFtVmFsdWUuZ2V0UGFyYW0oKSk7DQotCQlhc3NlcnRUcnVlKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX0lOT1VULmVuZHNXaXRoKHBhcmFtVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7DQotCQkNCi0JCS8vIE9VVCBjYXNlDQotCQl3ZWJQYXJhbS5zZXRLaW5kKFdlYlBhcmFtS2luZC5PVVQpOw0KLQkJYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJcGFyYW1WYWx1ZSA9IGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHMoIm1vZGUiLCBwYXJhbVZhbHVlLmdldFBhcmFtKCkpOw0KLQkJYXNzZXJ0VHJ1ZShXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9PVVQuZW5kc1dpdGgocGFyYW1WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25IZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCS8vIG5vdCBpbiBoZWFkZXIgY2FzZQ0KLQkJd2ViUGFyYW0uc2V0SGVhZGVyKGZhbHNlKTsNCi0JCUlBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJLy8gaW4gaGVhZGVyIGNhc2UNCi0JCXdlYlBhcmFtLnNldEhlYWRlcih0cnVlKTsNCi0JCWFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlID0gYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscygiaGVhZGVyIiwgcGFyYW1WYWx1ZS5nZXRQYXJhbSgpKTsNCi0JCWFzc2VydEVxdWFscygidHJ1ZSIsIHBhcmFtVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uTmFtZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJd2ViUGFyYW0uc2V0TmFtZSgiYXJnMCIpOw0KLQkJSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJDQotCQkvLyBpbiBoZWFkZXIgY2FzZQ0KLQkJd2ViUGFyYW0uc2V0TmFtZSgiY2hhbmdlZCIpOw0KLQkJYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbigpOw0KLQkJYXNzZXJ0RXF1YWxzKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT04sIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWUgPSBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgcGFyYW1WYWx1ZS5nZXRQYXJhbSgpKTsNCi0JCWFzc2VydEVxdWFscygiY2hhbmdlZCIsIHBhcmFtVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsJCQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uUGFydE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXdzTWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJd2ViUGFyYW0uc2V0UGFydE5hbWUoImFyZzAiKTsNCi0JCUlBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBhZGFwdGVyLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhXUF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJLy8gaW4gaGVhZGVyIGNhc2UNCi0JCXdlYlBhcmFtLnNldFBhcnROYW1lKCJjaGFuZ2VkIik7DQotCQlhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoV1BfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygxLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZSA9IGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHMoInBhcnROYW1lIiwgcGFyYW1WYWx1ZS5nZXRQYXJhbSgpKTsNCi0JCWFzc2VydEVxdWFscygiY2hhbmdlZCIsIHBhcmFtVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsJCQ0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZU5hbWVDaGFuZ2VzUGFydE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJd2ViUGFyYW0uc2V0TmFtZSgiY2hhbmdlZCIpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0UGFyYW0obWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSksIFdQX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygiY2hhbmdlZCIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpKTsNCi0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcnROYW1lIikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTmFtZURvZXNOb3RDaGFuZ2VQYXJ0TmFtZUlmUGFydE5hbWVJbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCW1ldGhvZCA9IHNlaVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCBtZXRob2QxKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtMVwiLCBwYXJ0TmFtZT1cInBhcmFtMVBhcnRcIikgaW50IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd3NNZXRob2QgPSB0ZXN0VXRpbC5maW5kV2ViTWV0aG9kQnlOYW1lKHNlaSwgIm1ldGhvZDEiKTsNCi0JCXdlYlBhcmFtID0gdGVzdFV0aWwuZmluZFBhcmFtKHdzTWV0aG9kLCAicGFyYW0xIik7DQotCQl3c01ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJd2ViUGFyYW0uc2V0TmFtZSgidGVzdCIpOw0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubm90YXRpb24gPSBpbnNwZWN0b3IuaW5zcGVjdFBhcmFtKG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpLCBXUF9BTk5PVEFUSU9OKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7DQotCQlhc3NlcnRFcXVhbHMoInBhcmFtMVBhcnQiLCBhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcnROYW1lIikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uVGFyZ2V0TlMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXdzTWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJd2ViUGFyYW0uc2V0VGFyZ2V0TmFtZXNwYWNlKCJodHRwOi8vY29tLnNhcC90ZXN0Iik7DQotCQlJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQkNCi0JCS8vIGNoYW5nZWQgdGFyZ2V0IG5hbWVzcGFjZSBjYXNlDQotCQl3ZWJQYXJhbS5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly9jaGFuZ2VkIik7DQotCQlhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygxLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZSA9IGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHMoInRhcmdldE5hbWVzcGFjZSIsIHBhcmFtVmFsdWUuZ2V0UGFyYW0oKSk7DQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9jaGFuZ2VkIiwgcGFyYW1WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwkJDQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXdzTWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCk7DQotCQl3ZWJQYXJhbS5zZXROYW1lKCJjaGFuZ2VkIik7DQotCQl3ZWJQYXJhbS5zZXRLaW5kKFdlYlBhcmFtS2luZC5JTk9VVCk7DQotCQl3ZWJQYXJhbS5zZXRQYXJ0TmFtZSgiZGlmZmVyZW50Iik7DQotCQl3ZWJQYXJhbS5zZXRIZWFkZXIodHJ1ZSk7DQotCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCXdlYlBhcmFtLnNldFRhcmdldE5hbWVzcGFjZSgiaHR0cDovL2NoYW5nZWQvdGVyZ2V0L25zIik7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RQYXJhbShtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcih3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpKSwgV1BfQU5OT1RBVElPTik7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKDQsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygiY2hhbmdlZCIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpKTsNCi0JCWFzc2VydFRydWUoV1BBbm5vdGF0aW9uRmVhdHVyZXMuV0VCX1BBUkFNX01PREVfSU5PVVQuZW5kc1dpdGgoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJtb2RlIikpKTsNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL2NoYW5nZWQvdGVyZ2V0L25zIiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0YXJnZXROYW1lc3BhY2UiKSk7DQotDQotCQl3c01ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCXdlYlBhcmFtLnNldFBhcnROYW1lKCJkaWZmZXJlbnQiKTsNCi0JCS8vIGNyZWF0ZSBuZXcgaW5zcGVjdG9yIGNhdXNlIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkDQotCQlpbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKHNlaVR5cGUpOw0KLQkJYW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0UGFyYW0obWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSksIFdQX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0RXF1YWxzKDUsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygiZGlmZmVyZW50IiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJ0TmFtZSIpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QW5ub3RhdGlvblJlbW92ZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW1ldGhvZCA9IHNlaVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCBtZXRob2QxKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtMVwiKSBpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3c01ldGhvZCA9IHRlc3RVdGlsLmZpbmRXZWJNZXRob2RCeU5hbWUoc2VpLCAibWV0aG9kMSIpOw0KLQkJd2ViUGFyYW0gPSB0ZXN0VXRpbC5maW5kUGFyYW0od3NNZXRob2QsICJwYXJhbTEiKTsNCi0JCXJlc291cmNlLmVuYWJsZVNhdmluZygpOw0KLQkJd2ViUGFyYW0uc2V0TmFtZSgiYXJnMCIpOw0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+YW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0UGFyYW0obWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSksIFdQX0FOTk9UQVRJT04pOw0KLQkJYXNzZXJ0TnVsbCgiRW1wdHkgYW5ub3RhdGlvbiBoYXMgbm90IGJlZW4gcmVtb3ZlZCIsIGFubm90YXRpb24pOw0KLQl9DQotDQotCXByb3RlY3RlZCBjbGFzcyBNeVBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXINCi0Jew0KLQkJcHVibGljIE15UGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJCXN1cGVyKHJlc291cmNlKTsNCi0JCX0NCi0NCi0JCXB1YmxpYyBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCQkJcmV0dXJuIHN1cGVyLmdldEFubm90YXRpb24oKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZWlTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlaVNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzg0MWQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlaVNlcmlhbGl6ZXJBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc2VyaWFsaXplci5TZWlTZXJpYWxpemVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFNlaVNlcmlhbGl6ZXJBZGFwdGVyfSBjbGFzczsNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaVNlcmlhbGl6ZXJBZGFwdGVyVGVzdCBleHRlbmRzIFNlcmlhbGl6ZXJBZGFwdGVyVGVzdEZpeHR1cmUgDQotew0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSUFubm90YXRpb25JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0cnkgew0KLQkJCW5ldyBNeVNlaVNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKS5jcmVhdGVJQW5ub3RhdGlvbigoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSludWxsLCBwcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pIHt9DQotCQkNCi0JCXRyeSB7DQotCQkJbmV3IE15U2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHNlaSwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXykge30NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSUFubm90YXRpb25FeHBsaWNpdFNlaSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSAgbmV3IE15U2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHNlaSwgcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpKTsNCi0JCWFzc2VydEVxdWFscygyLCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoVEFSR0VUX05BTUVTUEFDRSwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKSk7DQotCQlhc3NlcnRFcXVhbHMoUE9SVF9UWVBFX05BTUUsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShOQU1FX0FUVFJJQlVURSkpOw0KLQkJYXNzZXJ0RXF1YWxzKHNlaVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksICgoSVR5cGUpYW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJQW5ub3RhdGlvbkltcGxpY2l0U2VpKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IG5ldyBNeVNlaVNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKS5jcmVhdGVJQW5ub3RhdGlvbih3c0ltcGxpY2l0LmdldFNlcnZpY2VFbmRwb2ludCgpLCBwcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDUsIGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpKTsNCi0JCVdzU2VyaWFsaXplckFkYXB0ZXJUZXN0LmNoZWNrSVdlYlNlcnZpY2VJQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscygiSW1wbGljaXROYW1lIiwgYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFKSk7DQotCQlhc3NlcnRFcXVhbHMoaW1wbEJlYW5JbXBsaWNpdC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgKChJVHlwZSlhbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJQW5ub3RhdGlvbkRlZmF1bHRWYWx1ZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXNlaS5zZXROYW1lKCJTRUkiKTsNCi0JCXNlaS5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly90ZXN0LyIpOw0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IG5ldyBNeVNlaVNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKS5jcmVhdGVJQW5ub3RhdGlvbihzZWksIHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhTW9kZWwoKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJlc291cmNlLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQoc2VpLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQkJc2VpLnNldE5hbWUoIkNoYW5nZWRTZWlOYW1lIik7DQotCQkNCi0JCUlBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3Ioc2VpVHlwZSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gZm91bmQgPSBpbnNwZWN0b3IuaW5zcGVjdFR5cGUoV1NfQU5OT1RBVElPTik7DQotCQlhc3NlcnROb3ROdWxsKGZvdW5kKTsNCi0JCWFzc2VydEVxdWFscygiQ2hhbmdlZFNlaU5hbWUiLCBmb3VuZC5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKSk7DQotCQlhc3NlcnRFcXVhbHMoVEFSR0VUX05BTUVTUEFDRSwgZm91bmQuZ2V0UHJvcGVydHlWYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSkpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlTZWlTZXJpYWxpemVyQWRhcHRlciBleHRlbmRzIFNlaVNlcmlhbGl6ZXJBZGFwdGVyDQotCXsNCi0JCXB1YmxpYyBNeVNlaVNlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UpIHsNCi0JCQlzdXBlcihyZXNvdXJjZSk7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGNyZWF0ZUlBbm5vdGF0aW9uKGZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBmaW5hbCBJSmF2YU1vZGVsIGphdmFNb2RlbCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0JCXsNCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlSUFubm90YXRpb24oc2VpLCBqYXZhTW9kZWwpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY1MzM5NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklBbm5vdGF0aW9uU2VyaWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLlNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFdzU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5fSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeVRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UgDQotew0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2U7DQotCXByaXZhdGUgU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5IGZhY3Rvcnk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlNb2NrPElKYXZhTW9kZWw+IGphdmFNb2RlbE1vY2sgPSBtb2NrKElKYXZhTW9kZWwuY2xhc3MpOw0KLQkJcmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWxNb2NrLnByb3h5KCkpOw0KLQkJZmFjdG9yeSA9IHJlc291cmNlLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdElzRmFjdG9yeUZvclR5cGUoKQkNCi0JewkJDQotCQlhc3NlcnRUcnVlKGZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZShJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpKTsNCi0JCWFzc2VydEZhbHNlKGZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZShOb3RpZmljYXRpb24uY2xhc3MpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRXZWJTZXJ2aWNlKCkNCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQlBZGFwdGVyIGFkYXB0ZXIxID0gZmFjdG9yeS5hZGFwdCh3ZWJTZXJ2aWNlLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdlYlNlcnZpY2UuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJQWRhcHRlciBhZGFwdGVyMiA9IGZhY3RvcnkuYWRhcHQod2ViU2VydmljZSwgSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscygxLCB3ZWJTZXJ2aWNlLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQkNCi0JCWFzc2VydFRydWUoYWRhcHRlcjE9PWFkYXB0ZXIyKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFkYXB0U2VpKCkNCi0Jew0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQlBZGFwdGVyIGFkYXB0ZXIxID0gZmFjdG9yeS5hZGFwdChzZWksIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgc2VpLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQkNCi0JCUFkYXB0ZXIgYWRhcHRlcjIgPSBmYWN0b3J5LmFkYXB0KHNlaSwgSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscygxLCBzZWkuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyMT09YWRhcHRlcjIpOw0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlclRlc3RGaXh0dXJlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlclRlc3RGaXh0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQwZmNmZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJUZXN0Rml4dHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLkRvbVRlc3RVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJpYWxpemVyQWRhcHRlclRlc3RGaXh0dXJlIGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU19BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5XZWJTZXJ2aWNlIjsJDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9ICJNeVNlcnZpY2UiOw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1RZUEVfTkFNRSA9ICJNeVBvcnRUeXBlIjsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9OQU1FID0gIk15UG9ydCI7DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0UgPSAiaHR0cDovL2NvbS5zYXAvdGVzdCI7DQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTE9DQVRJT04gPSAiQzovdGVzdC93c2RsL2xvY2F0aW9uIjsNCi0JDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSB3czsNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIHdzSW1wbGljaXQ7DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByb3RlY3RlZCBUZXN0UHJvamVjdCBwcm9qZWN0Ow0KLQlwcm90ZWN0ZWQgSVR5cGUgaW1wbEJlYW5UeXBlOw0KLQlwcm90ZWN0ZWQgSVR5cGUgaW1wbEJlYW5JbXBsaWNpdDsNCi0JcHJvdGVjdGVkIElUeXBlIHNlaVR5cGU7DQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0Ow0KLQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZTsNCi0JcHJvdGVjdGVkIERvbVRlc3RVdGlscyB0ZXN0VXRpbCA9IG5ldyBEb21UZXN0VXRpbHMoKTsNCi0JcHJvdGVjdGVkIERvbVV0aWwgZG9tVXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGFjayA9IHByb2plY3QuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoInRlc3QiLCB0cnVlLCBudWxsKTsNCi0JCXNlaVR5cGUgPSBwcm9qZWN0LmNyZWF0ZVR5cGUocGFjaywgIlNFSS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiTXlQb3J0VHlwZVwiLCB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vY29tLnNhcC90ZXN0XCIpXG4iICsNCi0JCQkJInB1YmxpYyBpbnRlcmZhY2UgU0VJIHt9Iik7DQotCQlpbXBsQmVhblR5cGUgPSBwcm9qZWN0LmNyZWF0ZVR5cGUocGFjaywgIkltcGxCZWFuLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlPVwidGVzdC5TRUlcIiwgIiArDQotCQkJCSJzZXJ2aWNlTmFtZT1cIk15U2VydmljZVwiLCBwb3J0TmFtZT1cIk15UG9ydFwiLCB3c2RsTG9jYXRpb249XCJDOi90ZXN0L3dzZGwvbG9jYXRpb25cIiwgdGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL2NvbS5zYXAvdGVzdFwiKSIgKw0KLQkJCQkicHVibGljIGNsYXNzIEltcGxCZWFuIHt9Iik7DQotCQkNCi0JCWltcGxCZWFuSW1wbGljaXQgPSBwcm9qZWN0LmNyZWF0ZVR5cGUocGFjaywgIkltcGxpY2l0SW1wbEJlYW4uamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0TmFtZVwiLCAiICsNCi0JCQkJInNlcnZpY2VOYW1lPVwiTXlTZXJ2aWNlXCIsIHBvcnROYW1lPVwiTXlQb3J0XCIsIHdzZGxMb2NhdGlvbj1cIkM6L3Rlc3Qvd3NkbC9sb2NhdGlvblwiLCB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vY29tLnNhcC90ZXN0XCIpIiArDQotCQkicHVibGljIGNsYXNzIEltcGxpY2l0SW1wbEJlYW4ge30iKTsJCQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHNlaVR5cGUpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbXBsQmVhblR5cGUpOw0KLQkJcmVzb3VyY2UgPSBjcmVhdGVUYXJnZXQoKTsJDQotCQlyZXNvdXJjZS5sb2FkKG51bGwpOw0KLQkJDQotCQl3c1Byb2plY3QgPSByZXNvdXJjZS5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5nZXQoMCk7DQotCQlzZWkgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJvamVjdCwgInRlc3QuU0VJIik7DQotCQl3cyA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1Byb2plY3QsICJ0ZXN0LkltcGxCZWFuIik7DQotCQl3c0ltcGxpY2l0ID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJvamVjdCwgInRlc3QuSW1wbGljaXRJbXBsQmVhbiIpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdGVhckRvd24oKQ0KLQl7DQotCQl0cnkgew0KLQkJCXByb2plY3QuZGlzcG9zZSgpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIF8pIHsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIGNyZWF0ZVRhcmdldCgpDQotCXsNCi0JCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShwcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0SmF2YU1vZGVsKCkpIA0KLQkJew0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmVQcm9qZWN0KElKYXZhUHJvamVjdCBwcmopIA0KLQkJCXsNCi0JCQkJaWYgKHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCQl9DQotDQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9Ow0KLQl9CQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvV3NTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1dzU2VyaWFsaXplckFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIzZWEwZWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvV3NTZXJpYWxpemVyQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc2VyaWFsaXplcjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5QT1JUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NETF9MT0NBVElPTl9BVFRSSUJVVEU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklBbm5vdGF0aW9uU2VyaWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuV3NTZXJpYWxpemVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFdzU2VyaWFsaXplckFkYXB0ZXJ9IGNsYXNzLiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzU2VyaWFsaXplckFkYXB0ZXJUZXN0IGV4dGVuZHMgU2VyaWFsaXplckFkYXB0ZXJUZXN0Rml4dHVyZQ0KLXsNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUlBbm5vdGF0aW9uSVdlYlNlcnZpY2VOcGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRyeSB7DQotCQkJbmV3IE15V3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSkuY3JlYXRlSUFubm90YXRpb24oKElXZWJTZXJ2aWNlKW51bGwsIHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhTW9kZWwoKSk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXykge30NCi0JCQ0KLQkJdHJ5IHsNCi0JCQluZXcgTXlXc1NlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKS5jcmVhdGVJQW5ub3RhdGlvbih3cywgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXykge30JCQ0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUlBbm5vdGF0aW9uSVdlYlNlcnZpY2VFeHBsaWNpdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPSBuZXcgTXlXc1NlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKS5jcmVhdGVJQW5ub3RhdGlvbih3cywgcHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFNb2RlbCgpKTsNCi0JCWFzc2VydEVxdWFscyg1LCBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSk7DQotCQljaGVja0lXZWJTZXJ2aWNlSUFubm90YXRpb24oYW5ub3RhdGlvbik7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5FTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFKSk7DQotCQlhc3NlcnRFcXVhbHMoaW1wbEJlYW5UeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCAoKElUeXBlKWFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSUFubm90YXRpb25JV2ViU2VydmljZUltcGxpY2l0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IG5ldyBNeVdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHdzSW1wbGljaXQsIHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhTW9kZWwoKSk7DQotCQlhc3NlcnRFcXVhbHMoNSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQkJY2hlY2tJV2ViU2VydmljZUlBbm5vdGF0aW9uKGFubm90YXRpb24pOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoIkltcGxpY2l0TmFtZSIsIGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURSkpOwkJDQotCQlhc3NlcnRFcXVhbHMoaW1wbEJlYW5JbXBsaWNpdC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgKChJVHlwZSlhbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUlBbm5vdGF0aW9uSVdlYlNlcnZpY2VEZWZhdWx0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlyZXNvdXJjZS5kaXNhYmxlU2F2aW5nKCk7DQotCQl3c0ltcGxpY2l0LmdldFNlcnZpY2VFbmRwb2ludCgpLnNldE5hbWUoIkltcGxpY2l0SW1wbEJlYW4iKTsNCi0JCXdzSW1wbGljaXQuc2V0TmFtZSgiSW1wbGljaXRJbXBsQmVhblNlcnZpY2UiKTsNCi0JCXdzSW1wbGljaXQuc2V0UG9ydE5hbWUoIkltcGxpY2l0SW1wbEJlYW5Qb3J0Iik7DQotCQl3c0ltcGxpY2l0LnNldFRhcmdldE5hbWVzcGFjZSgiaHR0cDovL3Rlc3QvIik7DQotCQl3c0ltcGxpY2l0LnNldFdzZGxMb2NhdGlvbihudWxsKTsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24gPW5ldyBNeVdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpLmNyZWF0ZUlBbm5vdGF0aW9uKHdzSW1wbGljaXQsIHByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhTW9kZWwoKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJlc291cmNlLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQod3MsIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7DQotCQl3cy5zZXROYW1lKCJDaGFuZ2VkU2VydmljZSIpOw0KLQkJDQotCQlJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGltcGxCZWFuVHlwZSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gZm91bmQgPSBpbnNwZWN0b3IuaW5zcGVjdFR5cGUoV1NfQU5OT1RBVElPTik7DQotCQlhc3NlcnROb3ROdWxsKGZvdW5kKTsNCi0JCWFzc2VydEVxdWFscygiQ2hhbmdlZFNlcnZpY2UiLCBmb3VuZC5nZXRQcm9wZXJ0eVZhbHVlKFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscyhQT1JUX05BTUUsIGZvdW5kLmdldFByb3BlcnR5VmFsdWUoUE9SVF9OQU1FX0FUVFJJQlVURSkpOw0KLQkJYXNzZXJ0RXF1YWxzKFRBUkdFVF9OQU1FU1BBQ0UsIGZvdW5kLmdldFByb3BlcnR5VmFsdWUoVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUpKTsNCi0JCWFzc2VydEVxdWFscyhXU0RMX0xPQ0FUSU9OLCBmb3VuZC5nZXRQcm9wZXJ0eVZhbHVlKFdTRExfTE9DQVRJT05fQVRUUklCVVRFKSk7DQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0lXZWJTZXJ2aWNlSUFubm90YXRpb24oSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbikNCi0Jew0KLQkJYm9vbGVhbiBbXSBmb3VuZCA9IHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX07DQotCQlTdHJpbmcgW10gcGFyYW1zID0geyJzZXJ2aWNlTmFtZSIsICJwb3J0TmFtZSIsICJ0YXJnZXROYW1lc3BhY2UiLCAid3NkbExvY2F0aW9uIiB9Ow0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpKSANCi0JCXsNCi0JCQlTdHJpbmcgcGFyYW0gPSBwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpOw0KLQkJCWlmIChwYXJhbS5lcXVhbHMoV1NBbm5vdGF0aW9uRmVhdHVyZXMuU0VSVklDRV9OQU1FX0FUVFJJQlVURSkpIHsNCi0JCQkJYXNzZXJ0RXF1YWxzKFNFUlZJQ0VfTkFNRSwgcGFyYW1WYWx1ZVBhaXIuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsNCi0JCQkJZm91bmRbMF0gPSB0cnVlOw0KLQkJCX0NCi0JCQlpZiAocGFyYW0uZXF1YWxzKFdTQW5ub3RhdGlvbkZlYXR1cmVzLlBPUlRfTkFNRV9BVFRSSUJVVEUpKSB7DQotCQkJCWFzc2VydEVxdWFscyhQT1JUX05BTUUsIHBhcmFtVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7DQotCQkJCWZvdW5kWzFdID0gdHJ1ZTsNCi0JCQl9DQotCQkJaWYgKHBhcmFtLmVxdWFscyhXU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSkpIHsNCi0JCQkJYXNzZXJ0RXF1YWxzKFRBUkdFVF9OQU1FU1BBQ0UsIHBhcmFtVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7DQotCQkJCWZvdW5kWzJdID0gdHJ1ZTsNCi0JCQl9DQotCQkJaWYgKHBhcmFtLmVxdWFscyhXU0Fubm90YXRpb25GZWF0dXJlcy5XU0RMX0xPQ0FUSU9OX0FUVFJJQlVURSkpIHsNCi0JCQkJYXNzZXJ0RXF1YWxzKFdTRExfTE9DQVRJT04sIHBhcmFtVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7DQotCQkJCWZvdW5kWzNdID0gdHJ1ZTsNCi0JCQl9CQkJDQotCQl9DQotCQkNCi0JCWZvciAoaW50IGk9MDsgaSA8IGZvdW5kLmxlbmd0aDsgaSsrKSANCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJBbm5vdGF0aW9uIHBhcmFtICIgKyBwYXJhbXNbaV0gKyAiIG5vdCBmb3VuZCIsIGZvdW5kW2ldKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGNsYXNzIE15V3NTZXJpYWxpemVyQWRhcHRlciBleHRlbmRzIFdzU2VyaWFsaXplckFkYXB0ZXINCi0Jew0KLQkJcHVibGljIE15V3NTZXJpYWxpemVyQWRhcHRlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSB7DQotCQkJc3VwZXIocmVzb3VyY2UpOw0KLQkJfQ0KLQ0KLQkJQE92ZXJyaWRlDQotCQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gY3JlYXRlSUFubm90YXRpb24oZmluYWwgSVdlYlNlcnZpY2Ugd3MsIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCQl7DQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUlBbm5vdGF0aW9uKHdzLCBqYXZhTW9kZWwpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU4NWFkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvTWV0aG9kUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3RhdGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLlByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBDbGFzcyBjb250YWluaW5nIHRlc3RzIGZvciB7QGxpbmsgTWV0aG9kUHJvcGVydHlTdGF0ZUFkYXB0ZXJ9DQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgSVdlYk1ldGhvZCB3bTsNCi0JcHJpdmF0ZSBJV2ViU2VydmljZSB3czsNCi0JcHJpdmF0ZSBJUHJvcGVydHlTdGF0ZSBhZGFwdGVyOyANCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkJDQotCXsNCi0JCXdtID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJDQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCXNlaS5nZXRXZWJNZXRob2RzKCkuYWRkKHdtKTsNCi0JCXNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmFkZCh3cyk7DQotCQlhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3bSwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhbmdlYmxlT3V0c2lkZUluV3MoKSANCi0Jew0KLQkJd3Muc2V0V3NkbExvY2F0aW9uKCJDOi90ZXN0L3dzZGwvbG9jYXRpb24iKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fRVhDTFVERUQpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFuZ2FibGUoKQ0KLQl7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fRVhDTFVERUQpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg0MjIwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUuUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXI7DQotDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIFBhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyIGFkYXB0ZXI7Ow0KLQlwcml2YXRlIElXZWJQYXJhbSBwYXJhbTsNCi0JcHJpdmF0ZSBJV2ViTWV0aG9kIG1ldGhvZDsNCi0JcHJpdmF0ZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsJCQ0KLQkJc2VpID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJbWV0aG9kID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UuTElURVJBTCk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQpOw0KLQkJc2VpLmdldFdlYk1ldGhvZHMoKS5hZGQobWV0aG9kKTsNCi0JCQ0KLQkJcGFyYW0gPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViUGFyYW0oKTsNCi0JCXBhcmFtLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgInRlc3RQYXJhbSIpOw0KLQkJcGFyYW0uc2V0TmFtZSgidGVzdFBhcmFtIik7DQotCQltZXRob2QuZ2V0UGFyYW1ldGVycygpLmFkZChwYXJhbSk7DQotCQkNCi0JCWFkYXB0ZXIgPSBuZXcgUGFyYW1ldGVyUHJvcGVydHlTdGF0ZUFkYXB0ZXIoKTsNCi0JCWFkYXB0ZXIuc2V0VGFyZ2V0KHBhcmFtKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhZ2VibGVOYW1lQ29ycmVjdFNvYXBCaW5kaW5nKCkNCi0Jew0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhZ2VibGVOYW1lSW5jb3JyZWN0U29hcEJpbmRpbmcoKQ0KLQl7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLlJQQyk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCQ0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UuRU5DT0RFRCk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCQ0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhZ2VibGVOYW1lUGFyYW1JbkhlYWRlcigpDQotCXsNCi0JCXBhcmFtLnNldEhlYWRlcih0cnVlKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7CQkNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYWdlYmxlVGFyZ2V0TlNDb3JyZWN0U29hcEJpbmRpbmcoKQ0KLQl7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZVRhcmdldE5TSW5jb3JyZWN0U29hcEJpbmRpbmcoKQ0KLQl7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLlJQQyk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JCQ0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCk7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UuRU5DT0RFRCk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JCQ0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwpOw0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZVRhcmdldE5TUGFyYW1JbkhlYWRlcigpDQotCXsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkpOw0KLQkJcGFyYW0uc2V0SGVhZGVyKHRydWUpOw0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYWdlYmxlUGFydE5hbWVDb3JyZWN0U29hcEJpbmRpbmcoKQ0KLQl7DQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLlJQQyk7CQkNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhZ2VibGVQYXJ0TmFtZUluY29ycmVjdFNvYXBCaW5kaW5nKCkNCi0Jew0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUpKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZS5FTkNPREVEKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCQkNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZS5MSVRFUkFMKTsNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1BBUlRfTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFnZWJsZVRhcmdldE5TSGVhZGVyKCkgDQotCXsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fSEVBREVSKSk7DQotDQotCQltZXRob2Quc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlLlJQQyk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX0hFQURFUikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0dXJuUGFyYW1Ob3RFZGl0YWJsZSgpDQotCXsNCi0JCXBhcmFtLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgInJldHVybiIpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1BBUlRfTkFNRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCQkNCi0JCW1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUuUlBDKTsJCQ0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1BBUlRfTkFNRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RPdXRzaWRlSW5XZWJTZXJ2aWNlKCkNCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJd3Muc2V0V3NkbExvY2F0aW9uKCJDOi90ZXN0L3dzZGwvbG9jYXRpb24iKTsNCi0JCXNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmFkZCh3cyk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JCQ0KLQkJbWV0aG9kLnNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1BBUlRfTkFNRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFiY2JmYzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlTdGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5TZWlQcm9wZXJ0eVN0YXRlQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlLldzUHJvcGVydHlTdGF0ZUFkYXB0ZXI7DQotDQotLyoqDQotICogVGVzdHMgZm9yIHtAbGluayBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3Rvcnl9IGNsYXNzDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdElzRmFjdG9yeUZvclR5cGUoKQkNCi0JewkJDQotCQlhc3NlcnRUcnVlKFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5pc0ZhY3RvcnlGb3JUeXBlKElQcm9wZXJ0eVN0YXRlLmNsYXNzKSk7DQotCQlhc3NlcnRGYWxzZShQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuaXNGYWN0b3J5Rm9yVHlwZShOb3RpZmljYXRpb24uY2xhc3MpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRXZWJTZXJ2aWNlKCkNCi0Jew0KLQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQlBZGFwdGVyIGFkYXB0ZXIxID0gUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYlNlcnZpY2UsIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0JCWFzc2VydEVxdWFscygxLCB3ZWJTZXJ2aWNlLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIxIGluc3RhbmNlb2YgV3NQcm9wZXJ0eVN0YXRlQWRhcHRlcik7DQotCQkNCi0JCUFkYXB0ZXIgYWRhcHRlcjIgPSBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod2ViU2VydmljZSwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdlYlNlcnZpY2UuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyMT09YWRhcHRlcjIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRhcHRTZWkoKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCUFkYXB0ZXIgYWRhcHRlcjEgPSBQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoc2VpLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgc2VpLmVBZGFwdGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIxIGluc3RhbmNlb2YgU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIpOw0KLQkJDQotCQlBZGFwdGVyIGFkYXB0ZXIyID0gUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHNlaSwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHNlaS5lQWRhcHRlcnMoKS5zaXplKCkpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIxPT1hZGFwdGVyMik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1NlaVByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1NlaVByb3BlcnR5U3RhdGVBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzk1NjU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zdGF0ZS9TZWlQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3Rvcnk7DQotDQotLyoqDQotICogVGVzdCBmb3Ige0AgU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXJ9IGNsYXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpOw0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzOyANCi0JDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJc2VpID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOw0KLQkJd3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOw0KLQkJc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuYWRkKHdzKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0FkYXB0ZWQoKQ0KLQl7DQotCQlJUHJvcGVydHlTdGF0ZSBhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChzZWksIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0JCWFzc2VydE5vdE51bGwoYWRhcHRlcik7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhbmdlYWJsZU91dHNpZGVJbigpIA0KLQl7DQotCQl3cy5zZXRXc2RsTG9jYXRpb24oIkM6L3Rlc3QiKTsNCi0JCUlQcm9wZXJ0eVN0YXRlIGFkYXB0ZXIgPSAoSVByb3BlcnR5U3RhdGUpUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHNlaSwgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYW5nZWFsYmVJbk91dEltcGxpY2l0SW50ZXJmYWNlKCkNCi0Jew0KLQkJc2VpLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lULCBCb29sZWFuLlRSVUUpOw0KLQkJDQotCQlJUHJvcGVydHlTdGF0ZSBhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChzZWksIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYW5nZWFibGVJbk91dEV4cGxpY2l0SW50ZXJmYWNlKCkNCi0Jew0KLQkJSVByb3BlcnR5U3RhdGUgYWRhcHRlciA9IChJUHJvcGVydHlTdGF0ZSlQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQoc2VpLCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUKSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N0YXRlL1dzUHJvcGVydHlTdGF0ZUFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvV3NQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjExOTY4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3RhdGUvV3NQcm9wZXJ0eVN0YXRlQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgV3NQcm9wZXJ0eVN0YXRlQWRhcHRlcn0gY2xhc3MuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc1Byb3BlcnR5U3RhdGVBZGFwdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzOw0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKQl7DQotCQl3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0FkYXB0ZWQoKSANCi0Jew0KLQkJSVByb3BlcnR5U3RhdGUgYWRhcHRlciA9IChJUHJvcGVydHlTdGF0ZSlQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod3MsIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0JCWFzc2VydE5vdE51bGwoYWRhcHRlcik7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElzQ2hhbmdlYmxlT3V0c2lkZUluV3MoKSANCi0Jew0KLQkJd3Muc2V0V3NkbExvY2F0aW9uKCJDOi90ZXN0Iik7DQotCQlJUHJvcGVydHlTdGF0ZSBhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3cywgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCkpOw0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJc0NoYW5nYWJsZUluT3V0KCkNCi0Jew0KLQkJSVByb3BlcnR5U3RhdGUgYWRhcHRlciA9IChJUHJvcGVydHlTdGF0ZSlQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod3MsIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0NCi0JCWFzc2VydFRydWUoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19QT1JUX05BTUUpKTsNCi0JCWFzc2VydEZhbHNlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UKSk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIuaXNDaGFuZ2VhYmxlKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFKSk7DQotCQlhc3NlcnRGYWxzZShhZGFwdGVyLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDaGFuZ2VibGVOb25Xc0luc3RhbmNlKCkNCi0Jew0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQlJUHJvcGVydHlTdGF0ZSBhZGFwdGVyID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3cywgSVByb3BlcnR5U3RhdGUuY2xhc3MpOw0KLQkJKChBZGFwdGVyKWFkYXB0ZXIpLnNldFRhcmdldChzZWkpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0NoYW5nZWFibGUoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FKSk7CQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmY4ZmZiYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYy5BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplcn0gY2xhc3MsIG1ldGhvZHMgbm90IGNvdmVyZWQgaW4gdGhpcyB0ZXN0DQotICogYXJlIGNvdmVyZWQgaW1wbGljaXRseSBieSB7QGxpbmsgTW9kZWxTeW5jaHJvbml6YXRpb25UZXN0c30uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyVGVzdGVyIG1vZGVsU3luYzsNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkNCi0Jew0KLQkJTW9jazxJSmF2YU1vZGVsPiBqYXZhTW9kZWxNb2NrID0gbW9jayhJSmF2YU1vZGVsLmNsYXNzKTsNCi0JCXJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoamF2YU1vZGVsTW9jay5wcm94eSgpKTsNCi0JCQ0KLQkJbW9kZWxTeW5jID0gbmV3IEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0ZXIocmVzb3VyY2UsIHJlc291cmNlLm5ldyBTZXJ2aWNlTW9kZWxEYXRhKCkpe307DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzQ29tcGlsYXRpb25Vbml0RWRpdEVuYWJsZWREZXNwaXRlTlBFKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5pc1NhdmVFbmFibGVkKCkpOw0KLQkJdHJ5IHsNCi0JCQltb2RlbFN5bmMucHJvY2Vzc0NvbXBpbGF0aW9uVW5pdChudWxsLCBudWxsKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pIHsNCi0JCX0NCi0JCWFzc2VydFRydWUocmVzb3VyY2UuaXNTYXZlRW5hYmxlZCgpKTsNCi0JfQkJDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc0NvbXBpbGF0aW9uVW5pdEVkaXRFbmFibGVkTm9ybWFsRXhlY3V0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5pc1NhdmVFbmFibGVkKCkpOw0KLQkJTW9jazxJQ29tcGlsYXRpb25Vbml0PiBjdU1vY2sgPSBtb2NrKElDb21waWxhdGlvblVuaXQuY2xhc3MpOw0KLQkJY3VNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImZpbmRQcmltYXJ5VHlwZSIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOwkJCQ0KLQkJbW9kZWxTeW5jLnByb2Nlc3NDb21waWxhdGlvblVuaXQobnVsbCwgY3VNb2NrLnByb3h5KCkpOw0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZS5pc1NhdmVFbmFibGVkKCkpOw0KLQl9CQkJDQotCQ0KLQlwdWJsaWMgY2xhc3MgQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplclRlc3RlciBleHRlbmRzIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXINCi0Jew0KLQkJcHVibGljIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXJUZXN0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSwgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSkgew0KLQkJCXN1cGVyKHJlc291cmNlLCBzZXJ2aWNlRGF0YSk7DQotCQl9DQotCQkNCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb21waWxhdGlvblVuaXQoZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkJew0KLQkJCXN1cGVyLnByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcm9qZWN0LCBjdSk7DQotCQl9CQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9JbXBsaWNpdFNlaU1ldGhvZFN5bmNocm9uaXphdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9JbXBsaWNpdFNlaU1ldGhvZFN5bmNocm9uaXphdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlOTczMzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvSW1wbGljaXRTZWlNZXRob2RTeW5jaHJvbml6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1vZGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSVByb2plY3RTZWxlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuRG9tVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnMuSm9iVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi0NCi1wdWJsaWMgY2xhc3MgSW1wbGljaXRTZWlNZXRob2RTeW5jaHJvbml6YXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlDQotew0KLQ0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IHRlc3RQcmoxOw0KLQ0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0Ow0KLQ0KLQlwcml2YXRlIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQ0KLQlwcml2YXRlIElUeXBlIGJhc2VDbGFzc1dpdGhXc0Fubm90Ow0KLQ0KLQlwcml2YXRlIElUeXBlIGJhc2VDbGFzc1dpdGhvdXRXc0Fubm90Ow0KLQ0KLQlwcml2YXRlIElUeXBlIHdzQ2xhc3M7DQotDQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMTsNCi0NCi0JcHJpdmF0ZSBJV2ViU2VydmljZSB3czE7DQotDQotCXByaXZhdGUgRG9tVGVzdFV0aWxzIHV0aWwgPSBuZXcgRG9tVGVzdFV0aWxzKCk7DQotCXByaXZhdGUgRG9tVXRpbCBkb21VdGlsID0gbmV3IERvbVV0aWwoKTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHdzMUltcGxOYW1lID0gImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLldTMSI7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlqYXZhTW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCQl0YXJnZXQgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpDQotCQl7DQotDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIElQcm9qZWN0U2VsZWN0b3JbXSBnZXRQcm9qZWN0U2VsZWN0b3JzKCkNCi0JCQl7DQotCQkJCXJldHVybiBuZXcgSVByb2plY3RTZWxlY3RvcltdIHsgbmV3IElQcm9qZWN0U2VsZWN0b3IoKQ0KLQkJCQl7DQotDQotCQkJCQlwdWJsaWMgYm9vbGVhbiBhcHByb3ZlKElKYXZhUHJvamVjdCBwcmopDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuIHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCQkJfQ0KLQkJCQl9IH07DQotCQkJfQ0KLQ0KLQkJfTsNCi0JCXRlc3RQcmoxID0gbmV3IFRlc3RQcm9qZWN0KCJUZXN0UHJvamVjdDEiKTsNCi0JCXRlc3RQcmoxLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzEgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMSIpOw0KLQ0KLQkJYmFzZUNsYXNzV2l0aG91dFdzQW5ub3QgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJCYXNlQ2xhc3NXaXRob3V0V3NBbm5vdC5qYXZhIiwgInB1YmxpYyBjbGFzcyBCYXNlQ2xhc3NXaXRob3V0V3NBbm5vdCB7XG4iDQotCQkJCQkJCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kIHB1YmxpYyB2b2lkIGFubm90YXRpb25JbkJhc2VOb1dTQ2xhc3MoKXt9XG4iDQotCQkJCQkJCQkJCSsgInB1YmxpYyB2b2lkIG5vQW5ub3RhdGlvbkluQmFzZU5vV1NDbGFzcygpe31cbiIgKyAidm9pZCBub25QdWJsaWNJbkJhc2VOb1dTQ2xhc3MoKSB7fVxuIg0KLQkJCQkJCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZCBwdWJsaWMgdm9pZCB0b092ZXJyaWRlKCkge31cbiINCi0JCQkJCQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2QoZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCBleGNsdWRlZFB1YmxpY0luQmFzZU5vV1NDbGFzcygpIHt9XG4iICsgIn0iKTsNCi0NCi0JCWJhc2VDbGFzc1dpdGhXc0Fubm90ID0gdGVzdFByajENCi0JCQkJCQkJCQkJLmNyZWF0ZVR5cGUoDQotCQkJCQkJCQkJCQkJCQkJCQkJbW9kZWxTeW5jMSwNCi0JCQkJCQkJCQkJCQkJCQkJCQkiQmFzZUNsYXNzV2l0aFdzQW5ub3QuamF2YSIsDQotCQkJCQkJCQkJCQkJCQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgY2xhc3MgQmFzZUNsYXNzV2l0aFdzQW5ub3QgZXh0ZW5kcyBCYXNlQ2xhc3NXaXRob3V0V3NBbm5vdCB7XG4iDQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkrICJwdWJsaWMgdm9pZCBub1dNQW5ub2F0aW9uSW5CYXNlV1NDbGFzcygpIHt9XG4iDQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkrICJ2b2lkIG5vblB1YmxpY0luQmFzZVdTQ2xhc3MoKSB7fVxuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIm5hbWVJbkJhc2VDbGFzc1dpdGhBbm5vdFwiKSBwdWJsaWMgdm9pZCB0b092ZXJyaWRlKCkge31cbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKGV4Y2x1ZGU9dHJ1ZSkgcHVibGljIHZvaWQgZXhjbHVkZWRQdWJsaWNJbkJhc2VXU0NsYXNzKCkge31cbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgIn0iKTsNCi0NCi0JCXdzQ2xhc3MgPSB0ZXN0UHJqMQ0KLQkJCQkJCQkJCQkuY3JlYXRlVHlwZSgNCi0JCQkJCQkJCQkJCQkJCQkJCQltb2RlbFN5bmMxLA0KLQkJCQkJCQkJCQkJCQkJCQkJCSJXUzEuamF2YSIsDQotCQkJCQkJCQkJCQkJCQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkxTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MxIGV4dGVuZHMgQmFzZUNsYXNzV2l0aFdzQW5ub3Qge1xuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAicHVibGljIHZvaWQgbm9XTUFubm90YXRpb25JbldTQ2xhc3MoKTtcbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgInZvaWQgbm9uUHVibGljSW5XU0NsYXNzKCkge31cbiINCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJuYW1lSW5Xc0NsYXNzXCIpIHB1YmxpYyB2b2lkIHRvT3ZlcnJpZGUoKSB7fVxuIg0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2QoZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCBleGNsdWRlZFB1YmxpY0luV1NDbGFzcygpIHt9XG4iDQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTmFtZVwiLCBleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb24oKXt9XG4iDQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkrICJ9Iik7DQotCQkNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCXRhcmdldC5sb2FkKG51bGwpOw0KLQkJYXNzZXJ0RXF1YWxzKCJPbmUgcHJvamVjdHMgd2VyZSBkZWZpbmVkIGJ1dCBhIGRpZmZlcmVudCBudW1iZXIgd2VyZSBmb3VuZCBpbiB0aGUgRE9NIiwgMSwgdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoMiwgdGFyZ2V0LmdldERPTSgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLmdldCgwKS5nZXRXZWJTZXJ2aWNlcygpLnNpemUoKSk7DQotCQl3c1ByajEgPSBkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwod3NQcmoxKTsNCi0JCXdzMSA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzMUltcGxOYW1lKTsNCi0JCWFzc2VydE5vdE51bGwod3MxKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X21ldGhvZE5vQW5ub3RhdGlvblN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbSA9IHV0aWwuZ2V0RXhpc3RpbmdNZXRob2Qod3NDbGFzcywgIm5vV01Bbm5vdGF0aW9uSW5XU0NsYXNzIik7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSk7DQotCQlhc3NlcnROb3ROdWxsKHdtKTsNCi0JCWFzc2VydEVxdWFscyhtZXRob2RFbGVtLmdldEVsZW1lbnROYW1lKCksIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdtLmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSwgd20uZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlhc3NlcnRGYWxzZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kTm9Bbm5vdGF0aW9uSW5QYXJlbnRXaXRoV1NBbm5vdGF0aW9uU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZChiYXNlQ2xhc3NXaXRoV3NBbm5vdCwgIm5vV01Bbm5vYXRpb25JbkJhc2VXU0NsYXNzIik7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSk7DQotCQlhc3NlcnROb3ROdWxsKHdtKTsNCi0JCWFzc2VydEVxdWFscyhtZXRob2RFbGVtLmdldEVsZW1lbnROYW1lKCksIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdtLmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSwgd20uZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlhc3NlcnRGYWxzZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfbWV0aG9kTm9Bbm5vdGF0aW9uSW5QYXJlbnRXaXRob3V0V3NBbm5vdGF0aW9uTm90U3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZChiYXNlQ2xhc3NXaXRob3V0V3NBbm5vdCwgIm5vQW5ub3RhdGlvbkluQmFzZU5vV1NDbGFzcyIpOw0KLQkJZmluYWwgSVdlYk1ldGhvZCB3bSA9IGZpbmRXZWJNZXRob2RCeUltcGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpLCBjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSkpOw0KLQkJYXNzZXJ0TnVsbCh3bSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9tZXRob2RXaXRoQW5ub3RhdGlvbkluUGFyZW50V2l0aG91dFdzQW5ub3RhdGlvblN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbUJhc2VOb1dzQ2xhc3MgPSB1dGlsLmdldEV4aXN0aW5nTWV0aG9kKGJhc2VDbGFzc1dpdGhvdXRXc0Fubm90LCAiYW5ub3RhdGlvbkluQmFzZU5vV1NDbGFzcyIpOw0KLQkJYXNzZXJ0Tm90TnVsbChmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzKSkpOw0KLQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3Rfbm9uUHVibGljTWV0aG9kVHJvdWdoSGllcmFyY2h5Tm90U3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtQmFzZU5vV3NDbGFzcyA9IHV0aWwuZ2V0RXhpc3RpbmdNZXRob2QoYmFzZUNsYXNzV2l0aG91dFdzQW5ub3QsICJub25QdWJsaWNJbkJhc2VOb1dTQ2xhc3MiKTsNCi0JCWFzc2VydEZhbHNlKE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzLmdldEZsYWdzKCkpKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbUJhc2VXc0NsYXNzID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZChiYXNlQ2xhc3NXaXRoV3NBbm5vdCwgIm5vblB1YmxpY0luQmFzZVdTQ2xhc3MiKTsNCi0JCWFzc2VydEZhbHNlKE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZEVsZW1CYXNlV3NDbGFzcy5nZXRGbGFncygpKSk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW1Xc0NsYXNzID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZCh3c0NsYXNzLCAibm9uUHVibGljSW5XU0NsYXNzIik7DQotCQlhc3NlcnRGYWxzZShNb2RpZmllci5pc1B1YmxpYyhtZXRob2RFbGVtV3NDbGFzcy5nZXRGbGFncygpKSk7DQotDQotCQlhc3NlcnROdWxsKGZpbmRXZWJNZXRob2RCeUltcGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpLCBjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbUJhc2VOb1dzQ2xhc3MpKSk7DQotCQlhc3NlcnROdWxsKGZpbmRXZWJNZXRob2RCeUltcGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpLCBjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbUJhc2VXc0NsYXNzKSkpOw0KLQkJYXNzZXJ0TnVsbChmaW5kV2ViTWV0aG9kQnlJbXBsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW1Xc0NsYXNzKSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfZXhjbHVkZWRNZXRob2RUcm91Z2hIaWVyYXJjaHlOb3RTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZChiYXNlQ2xhc3NXaXRob3V0V3NBbm5vdCwgImV4Y2x1ZGVkUHVibGljSW5CYXNlTm9XU0NsYXNzIik7DQotCQlhc3NlcnRUcnVlKE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZEVsZW1CYXNlTm9Xc0NsYXNzLmdldEZsYWdzKCkpKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kRWxlbUJhc2VXc0NsYXNzID0gdXRpbC5nZXRFeGlzdGluZ01ldGhvZChiYXNlQ2xhc3NXaXRoV3NBbm5vdCwgImV4Y2x1ZGVkUHVibGljSW5CYXNlV1NDbGFzcyIpOw0KLQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5pc1B1YmxpYyhtZXRob2RFbGVtQmFzZVdzQ2xhc3MuZ2V0RmxhZ3MoKSkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtV3NDbGFzcyA9IHV0aWwuZ2V0RXhpc3RpbmdNZXRob2Qod3NDbGFzcywgImV4Y2x1ZGVkUHVibGljSW5XU0NsYXNzIik7DQotCQlhc3NlcnRUcnVlKE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZEVsZW1Xc0NsYXNzLmdldEZsYWdzKCkpKTsNCi0NCi0JCWFzc2VydE51bGwoZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtQmFzZU5vV3NDbGFzcykpKTsNCi0JCWFzc2VydE51bGwoZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtQmFzZVdzQ2xhc3MpKSk7DQotCQlhc3NlcnROdWxsKGZpbmRXZWJNZXRob2RCeUltcGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpLCBjYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbVdzQ2xhc3MpKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9vdmVycmlkZU1ldGhvZHNMb2FkZWRQcm9wZXJseSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtQmFzZU5vV3NDbGFzcyA9IHV0aWwuZ2V0RXhpc3RpbmdNZXRob2QoYmFzZUNsYXNzV2l0aG91dFdzQW5ub3QsICJ0b092ZXJyaWRlIik7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZmluZFdlYk1ldGhvZEJ5SW1wbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCksIGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtQmFzZU5vV3NDbGFzcykpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3bSk7DQotCQlhc3NlcnRFcXVhbHMoIm5hbWVJbldzQ2xhc3MiLCB3bS5nZXROYW1lKCkpOw0KLQl9DQotDQotCXByaXZhdGUgSVdlYk1ldGhvZCBmaW5kV2ViTWV0aG9kQnlJbXBsKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBTdHJpbmcgaW1wbCkNCi0Jew0KLQkJZm9yIChJV2ViTWV0aG9kIHdtIDogc2VpLmdldFdlYk1ldGhvZHMoKSkNCi0JCXsNCi0JCQlpZiAod20uZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gd207DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY0ltcGxlbWVudGF0aW9uKElNZXRob2QgbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gbS5nZXRFbGVtZW50TmFtZSgpICsgbS5nZXRTaWduYXR1cmUoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9NZXRob2RQYXJhbXNTeW5jaHJvbml6YXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvTWV0aG9kUGFyYW1zU3luY2hyb25pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGMzYjMxNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9NZXRob2RQYXJhbXNTeW5jaHJvbml6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmMuUGFyYW1ldGVyU3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLkRvbVRlc3RVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5JV2FpdENvbmRpdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkFzc2VydGlvbnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RFamIzUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQ0KLXB1YmxpYyBjbGFzcyBNZXRob2RQYXJhbXNTeW5jaHJvbml6YXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIFRlc3RFamIzUHJvamVjdCB0ZXN0RWpiUHJqMTsNCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgdGVzdFByajE7DQotCXByaXZhdGUgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXQ7DQotCXByaXZhdGUgSUphdmFNb2RlbCBqYXZhTW9kZWw7DQotCXByaXZhdGUgSVR5cGUgc2VpMVR5cGU7DQotDQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMTsNCi0JcHJpdmF0ZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTE7DQotDQotCXByaXZhdGUgRG9tVXRpbCBkb21VdGlsID0gbmV3IERvbVV0aWwoKTsNCi0JcHJpdmF0ZSBEb21UZXN0VXRpbHMgdGVzdFV0aWwgPSBuZXcgRG9tVGVzdFV0aWxzKCk7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzZWkxSW1wbE5hbWUgPSAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMSI7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlqYXZhTW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCQl0YXJnZXQgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpIA0KLQkJew0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBJUHJvamVjdFNlbGVjdG9yW10gZ2V0UHJvamVjdFNlbGVjdG9ycygpDQotCQkJew0KLQkJCQlyZXR1cm4gbmV3IElQcm9qZWN0U2VsZWN0b3JbXSB7IG5ldyBJUHJvamVjdFNlbGVjdG9yKCkgDQotCQkJCXsNCi0JCQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikgew0KLQkJCQkJCXJldHVybiBwcmouZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModGVzdFByajEuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJCQl9DQotCQkJCX19Ow0KLQkJCX0NCi0JCQkNCi0JCX07DQotCQl0ZXN0RWpiUHJqMSA9IG5ldyBUZXN0RWpiM1Byb2plY3QoIlRlc3RQcm9qZWN0MSIpOw0KLQkJdGVzdFByajEgPSBKYXZhQ29yZS5jcmVhdGUodGVzdEVqYlByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmZpbmRQYWNrYWdlRnJhZ21lbnRSb290KHRlc3RFamJQcmoxLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmFwcGVuZCgiZWpiTW9kdWxlIikpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEiLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJYXNzZXJ0VHJ1ZShtb2RlbFN5bmMxLmV4aXN0cygpKTsNCi0JCQ0KLQkJZmluYWwgU3RyaW5nIGNvbnRlbnRzID0gImltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZztcbmltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyO1xuQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge30iOw0KLQkJc2VpMVR5cGUgPSBjcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkxLmphdmEiLCBjb250ZW50cyk7DQotCQljcmVhdGVUeXBlKG1vZGVsU3luYzEsICJDbGFzczEuamF2YSIsICJwdWJsaWMgY2xhc3MgQ2xhc3MxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQl0YXJnZXQubG9hZChudWxsKTsNCi0JCWFzc2VydEVxdWFscygiT25lIHByb2plY3RzIHdlcmUgZGVmaW5lZCBidXQgYSBkaWZmZXJlbnQgbnVtYmVyIHdlcmUgZm91bmQgaW4gdGhlIERPTSIsIDEsIHRhcmdldC5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRhcmdldC5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5nZXQoMCkuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLnNpemUoKSk7DQotCQl3c1ByajEgPSBkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwod3NQcmoxKTsNCi0JCXNlaTEgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgc2VpMUltcGxOYW1lKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpMSk7DQotCX0NCi0JDQotCXByaXZhdGUgSVR5cGUgY3JlYXRlVHlwZShJUGFja2FnZUZyYWdtZW50IHBhY2ssIFN0cmluZyBjb21wVW5pdCwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCQlidWYuYXBwZW5kKCJwYWNrYWdlICIgKyBwYWNrLmdldEVsZW1lbnROYW1lKCkgKyAiO1xuIik7DQotCQlidWYuYXBwZW5kKCJcbiIpOw0KLQkJYnVmLmFwcGVuZChjb250ZW50cyk7DQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFjay5jcmVhdGVDb21waWxhdGlvblVuaXQoY29tcFVuaXQsIGJ1Zi50b1N0cmluZygpLCBmYWxzZSwgbnVsbCk7DQotCQlyZXR1cm4gY3UuZ2V0VHlwZXMoKVswXTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0b3BTeW5jaHJvbml6aW5nKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3Rfdm9pZE1ldGhvZFdpdGhOb0FyZ3NTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIHZvaWROb0FyZ3MgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uKCk7XG4iLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24odm9pZE5vQXJncykpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKHZvaWROb0FyZ3MpKTsNCi0JCWFzc2VydEVxdWFscygwLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9ub25Wb2lkTWV0aG9kV2l0aE5vQXJncygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBub25Wb2lkTm9BcmdzID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgQ2xhc3MxIG5vblZvaWRNZXRob2RXaXRoTm9BcmdzKCk7XG4iLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obm9uVm9pZE5vQXJncykpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG5vblZvaWROb0FyZ3MpKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygicmV0dXJuIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFdlYlBhcmFtS2luZC5PVVQsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0S2luZCgpKTsNCi0JCWFzc2VydEVxdWFscygiUUNsYXNzMTsiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFR5cGVOYW1lKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3Rfdm9pZE1ldGhvZFdpdGhQcmltaXRpdmVBcmcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aFByaW1pdGl2ZUFyZyhpbnQgcGFyYW0xKTtcbiIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygiYXJnMCIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscyhXZWJQYXJhbUtpbmQuSU4sIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0S2luZCgpKTsNCi0JCWFzc2VydEVxdWFscygiSSIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VHlwZU5hbWUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF92b2lkTWV0aG9kV2l0aE5vblBhcmFtZXRlcml6ZWRIb2xkZXJQYXJhbSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoUGFyYW1ldGVyaXplZEhvbGRlclBhcmFtKEhvbGRlciBwYXJhbTEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygiYXJnMCIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCS8vRklYTUUgY29tbWVudGluZyBvdXQgZm9yIGJ1aWxkIGludGVncmF0aW9uLiBUaHJvd2luZyBhbiBhc3NlcnRpb24gZXJyb3I6IGV4cGVjdGVkIElOT1VUIGJ1dCB3YXMgSU4NCi0JCS8vYXNzZXJ0RXF1YWxzKFdlYlBhcmFtS2luZC5JTk9VVCwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRLaW5kKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJRSG9sZGVyOyIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VHlwZU5hbWUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF92b2lkTWV0aG9kV2l0aFBhcmFtZXRlcml6ZWRIb2xkZXJQYXJhbSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoUGFyYW1ldGVyaXplZEhvbGRlclBhcmFtKGphdmF4LnhtbC53cy5Ib2xkZXI8Q2xhc3MxPiBwYXJhbTEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygiYXJnMCIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCS8vRklYTUUgY29tbWVudGluZyBvdXQgZm9yIGJ1aWxkIGludGVncmF0aW9uLiBUaHJvd2luZyBhbiBhc3NlcnRpb24gZXJyb3I6IGV4cGVjdGVkIElOT1VUIGJ1dCB3YXMgSU4NCi0JCS8vYXNzZXJ0RXF1YWxzKFdlYlBhcmFtS2luZC5JTk9VVCwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRLaW5kKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJRamF2YXgueG1sLndzLkhvbGRlcjxRQ2xhc3MxOz47Iiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUeXBlTmFtZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtTmFtZURlZmF1bHRTdW5jaHJvbml6ZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCBtZXRob2QxKGludCBwYXJhbSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJhcmcwIiwgdGVzdFV0aWwuZmluZFBhcmFtKHdzTWV0aG9kLCAicGFyYW0iKS5nZXROYW1lKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtTmFtZVN1bmNocm9uaXplZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyBpbnQgbWV0aG9kMihAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbVwiLCBoZWFkZXI9dHJ1ZSkgaW50IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJhbSIsIHRlc3RVdGlsLmZpbmRQYXJhbSh3c01ldGhvZCwgInBhcmFtMSIpLmdldE5hbWUoKSk7CQkNCi0JCWFzc2VydEVxdWFscygicmV0dXJuIiwgdGVzdFV0aWwuZmluZFBhcmFtKHdzTWV0aG9kLCAicmV0dXJuIikuZ2V0TmFtZSgpKTsJCQ0KLQ0KLQkJLy8gb3BlcmF0aW9uIGlzIERvY3VtZW50L0JhcmUgLSB0aGUgcGFyYW1ldGVycyB1c2UgbWV0aG9kIG5hbWUNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kMiA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgiQFNPQVBCaW5kaW5nKHN0eWxlPVNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCBwYXJhbWV0ZXJTdHlsZT1TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKVxuIiArDQotCQkJCSJwdWJsaWMgaW50IG1ldGhvZDMoaW50IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZDIpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZDIgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMikpOw0KLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QzUmVzcG9uc2UiLCB0ZXN0VXRpbC5maW5kUGFyYW0od3NNZXRob2QyLCAicmV0dXJuIikuZ2V0TmFtZSgpKTsJDQotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDMiLCB0ZXN0VXRpbC5maW5kUGFyYW0od3NNZXRob2QyLCAicGFyYW0xIikuZ2V0TmFtZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9wYXJhbUhlYWRlckRlZmF1bHRTeW5jcm9taXplZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QxID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCBtZXRob2QyKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtMVwiKSBpbnQgcGFyYW0xKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZDEpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZDEgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMSkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kMS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygicGFyYW0xIiwgd3NNZXRob2QxLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydEZhbHNlKHdzTWV0aG9kMS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmlzSGVhZGVyKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1IZWFkZXJGYWxzZVN5bmNyb21pemVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZDIgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoInB1YmxpYyB2b2lkIG1ldGhvZDIoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIsIGhlYWRlcj1mYWxzZSkgaW50IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZDIpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZDIgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kMikpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kMi5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygicGFyYW0xIiwgd3NNZXRob2QyLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydEZhbHNlKHdzTWV0aG9kMi5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmlzSGVhZGVyKCkpOwkJDQotCX0JDQotDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1IZWFkZXJUcnVlU3luY3JvbWl6ZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kMiA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgbWV0aG9kMihAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbTFcIiwgaGVhZGVyPXRydWUpIGludCBwYXJhbTEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QyKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QyID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZDIpKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c01ldGhvZDIuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoInBhcmFtMSIsIHdzTWV0aG9kMi5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdzTWV0aG9kMi5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmlzSGVhZGVyKCkpOwkJDQotCX0JCQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtUGFydE5hbWVEZWZhdWx0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgdm9pZE1ldGhvZEV4Y2x1ZGVkKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtQVwiKSBpbnQgYSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFdlYlBhcmFtS2luZC5JTiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRLaW5kKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJJIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUeXBlTmFtZSgpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJhbUEiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoInBhcmFtQSIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0UGFydE5hbWUoKSk7CQkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtUGFydE5hbWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCB2b2lkTWV0aG9kRXhjbHVkZWQoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW1BXCIsIHBhcnROYW1lPVwicGFydE5hbWVBXCIpIGludCBhKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQl3YWl0TWV0aG9kTG9hZGVkSW5Eb20oc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoV2ViUGFyYW1LaW5kLklOLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldEtpbmQoKSk7DQotCQlhc3NlcnRFcXVhbHMoIkkiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFR5cGVOYW1lKCkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoInBhcmFtQSIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygicGFydE5hbWVBIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRQYXJ0TmFtZSgpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtVGFyZ2V0TmFtZXNwYWNlRGVmYXVsdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOwkJDQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaTFUeXBlLmNyZWF0ZU1ldGhvZCgicHVibGljIHZvaWQgdm9pZE1ldGhvZEV4Y2x1ZGVkKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtQVwiKSBpbnQgYSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFdlYlBhcmFtS2luZC5JTiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRLaW5kKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJJIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUeXBlTmFtZSgpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJwYXJhbUEiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMoIiIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcGFyYW1UYXJnZXROYW1lc3BhY2VFbXB0eU5zKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7CQkNCi0JCS8vIHBhcmFtZXRlciBpcyBub3QgaW4gdGhlIGhlYWRlcg0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSBzZWkxVHlwZS5jcmVhdGVNZXRob2QoIkBTT0FQQmluZGluZyhzdHlsZT1TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgcGFyYW1ldGVyU3R5bGU9U09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCkgIiArDQotCQkJCSJwdWJsaWMgdm9pZCBtZXRob2QzKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtXCIsIGhlYWRlcj1mYWxzZSkgaW50IHBhcmFtMSk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJd2FpdE1ldGhvZExvYWRlZEluRG9tKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdzTWV0aG9kID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCIiLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFRhcmdldE5hbWVzcGFjZSgpKTsNCi0JCQ0KLQkJLy8gcGFyYW1ldGVyIGlzIGluIGhlYWRlcg0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QyID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJAU09BUEJpbmRpbmcoc3R5bGU9U09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIHBhcmFtZXRlclN0eWxlPVNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQpXG4iICsNCi0JCQkJInB1YmxpYyB2b2lkIG1ldGhvZDQoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW1cIiwgaGVhZGVyPXRydWUpIGludCBwYXJhbTEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QyKSk7DQotCQkNCi0JCWZpbmFsIElXZWJNZXRob2Qgd3NNZXRob2QyID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZDIpKTsNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL3NhcC5jb20vdGVzdC9tb2RlbHN5bmMxLyIsIHdzTWV0aG9kMi5nZXRQYXJhbWV0ZXJzKCkuZ2V0KDApLmdldFRhcmdldE5hbWVzcGFjZSgpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtVGFyZ2V0TmFtZXNwYWNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7CQkNCi0JCWZpbmFsIElNZXRob2QgbWV0aG9kID0gc2VpMVR5cGUuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCB2b2lkTWV0aG9kRXhjbHVkZWQoQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW1BXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly90YXJnZXROcy9cIikgaW50IGEpOyIsIG51bGwsIGZhbHNlLCBudWxsKTsNCi0JCXdhaXRNZXRob2RMb2FkZWRJbkRvbShzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3c01ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c01ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscyhXZWJQYXJhbUtpbmQuSU4sIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0S2luZCgpKTsNCi0JCWFzc2VydEVxdWFscygiSSIsIHdzTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkuZ2V0VHlwZU5hbWUoKSk7DQotCQkNCi0JCWFzc2VydEVxdWFscygicGFyYW1BIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGFyZ2V0TnMvIiwgd3NNZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7CQkNCi0JfQkNCi0JDQotCXByaXZhdGUgdm9pZCB3YWl0TWV0aG9kTG9hZGVkSW5Eb20oZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIFN0cmluZyBpbXBsZW1lbnRhdGlvbikNCi0Jew0KLQkJZmluYWwgSVdhaXRDb25kaXRpb24gY29uZGl0aW9uID0gbmV3IElXYWl0Q29uZGl0aW9uKCl7DQotCQkJcHVibGljIGJvb2xlYW4gY2hlY2tDb25kaXRpb24oKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWksIGltcGxlbWVudGF0aW9uKSAhPSBudWxsOw0KLQkJCX19Ow0KLQkJQXNzZXJ0aW9ucy53YWl0QXNzZXJ0KGNvbmRpdGlvbiwgIk1ldGhvZCAiICsgaW1wbGVtZW50YXRpb24gKyAiIG5vdCBmb3VuZCIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtVHlwZVJlc29sdmVkRm9yTm9uUXVhbGlmaWVkSG9sZGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgUGFyYW1ldGVyU3luY2hyb25pemVyRm9yUGFyYW1UeXBlc1Rlc3RzIHN5bmNyb25pemVyID0gbmV3IFBhcmFtZXRlclN5bmNocm9uaXplckZvclBhcmFtVHlwZXNUZXN0cyhudWxsKTsNCi0JCXN5bmNyb25pemVyLmNhbGNLaW5kKG51bGwsIG51bGwsICJRSG9sZGVyOyIpOw0KLQkJYXNzZXJ0VHJ1ZSgicmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSBzaG91bGQgYmUgY2FsbGVkIGZvciBub24gcXVhbGlmaWVkIEhvbGRlciB0eXBlIiwgc3luY3Jvbml6ZXIuY2FsbGVkKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9wYXJhbVR5cGVSZXNvbHZlZEZvclF1YWxpZmllZEhvbGRlclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFBhcmFtZXRlclN5bmNocm9uaXplckZvclBhcmFtVHlwZXNUZXN0cyBzeW5jcm9uaXplciA9IG5ldyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXJGb3JQYXJhbVR5cGVzVGVzdHMobnVsbCk7DQotCQlzeW5jcm9uaXplci5jYWxjS2luZChudWxsLCBudWxsLCAiUWphdmF4LnhtbC53cy5Ib2xkZXI8UUNsYXNzMTs+OyIpOw0KLQkJYXNzZXJ0VHJ1ZSgicmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSBzaG91bGQgYmUgY2FsbGVkIGZvciBxdWFsaWZpZWQgSG9sZGVyIHR5cGUiLCBzeW5jcm9uaXplci5jYWxsZWQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3BhcmFtVHlwZU5vdFJlc29sdmVkRm9yTm9uSG9sZGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgUGFyYW1ldGVyU3luY2hyb25pemVyRm9yUGFyYW1UeXBlc1Rlc3RzIHN5bmNyb25pemVyID0gbmV3IFBhcmFtZXRlclN5bmNocm9uaXplckZvclBhcmFtVHlwZXNUZXN0cyhudWxsKTsNCi0JCXN5bmNyb25pemVyLmNhbGNLaW5kKG51bGwsIG51bGwsICJRU3RyaW5nOyIpOw0KLQkJYXNzZXJ0RmFsc2UoInJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIG5vbiBIb2xkZXIgdHlwZSIsIHN5bmNyb25pemVyLmNhbGxlZCk7DQotCX0NCi0JDQotCXByaXZhdGUgY2xhc3MgUGFyYW1ldGVyU3luY2hyb25pemVyRm9yUGFyYW1UeXBlc1Rlc3RzIGV4dGVuZHMgUGFyYW1ldGVyU3luY2hyb25pemVyDQotCXsNCi0JCXB1YmxpYyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXJGb3JQYXJhbVR5cGVzVGVzdHMoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpIHsNCi0JCQlzdXBlcihwYXJlbnQpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIGJvb2xlYW4gY2FsbGVkID0gZmFsc2U7DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIFdlYlBhcmFtS2luZCBjYWxjS2luZChmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gcGFybUFubm90YXRpb24sIGZpbmFsIElNZXRob2QgbWV0aG9kLCBmaW5hbCBTdHJpbmcgdHlwZVNpZ25hdHVyZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gc3VwZXIuY2FsY0tpbmQocGFybUFubm90YXRpb24sIG1ldGhvZCwgdHlwZVNpZ25hdHVyZSk7DQotCQl9DQotCQkNCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKGZpbmFsIElNZXRob2QgbWV0aG9kLCBmaW5hbCBTdHJpbmcgdHlwZVNpZ25hdHVyZSkgew0KLQkJCWNhbGxlZCA9IHRydWU7DQotCQkJcmV0dXJuICIiOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL01vZGVsU3luY2hyb25pemF0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL01vZGVsU3luY2hyb25pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2U1MTVkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9Nb2RlbFN5bmNocm9uaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnMuSm9iVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0RWpiM1Byb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsNCi0NCi1wdWJsaWMgY2xhc3MgTW9kZWxTeW5jaHJvbml6YXRpb25UZXN0cyBleHRlbmRzIFN5bmNocm9uaXphdGlvblRlc3RGaXh0dXJlDQotew0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0QmVmb3JlQWZ0ZXJBcmVUaGVTYW1lKCkNCi0JewlmaW5hbCBJV2ViU2VydmljZVByb2plY3QgbmV3UmVmV3NQcmoxID0gZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlhc3NlcnRFcXVhbHMod3NQcmoxLCBuZXdSZWZXc1ByajEpOw0KLQkJYXNzZXJ0RXF1YWxzKHdzMSwgZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKG5ld1JlZldzUHJqMSwgd3MxSW1wbE5hbWUpKTsNCi0JCWFzc2VydEVxdWFscyhzZWkxLCBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKG5ld1JlZldzUHJqMSwgc2VpMUltcGxOYW1lKSk7DQotCQkNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCBuZXdSZWZXc1ByajIgPSBkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajIuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscyh3c1ByajIsIG5ld1JlZldzUHJqMik7DQotCQlhc3NlcnRFcXVhbHMod3MyLCBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUobmV3UmVmV3NQcmoyLCB3czJJbXBsTmFtZSkpOw0KLQkJYXNzZXJ0RXF1YWxzKHNlaTIsIGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUobmV3UmVmV3NQcmoyLCBzZWkySW1wbE5hbWUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9vcGVuZWRXc1Byb2plY3RTeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBUZXN0UHJvamVjdCB0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdChuZXcgVGVzdEVqYjNQcm9qZWN0KCJUZXN0RUpCUHJvamVjdDMiKS5nZXRQcm9qZWN0KCkpOw0KLQkJdHJ5IHsNCi0JCQlhbGxvd2VkUHJvamVjdHMuYWRkKHRlc3RQcmozLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMzID0gdGVzdFByajMuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzMiKTsNCi0JCQl0ZXN0UHJqMy5jcmVhdGVUeXBlKG1vZGVsU3luYzMsICJTZWkzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkzTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTMge30iKTsNCi0JCQl0ZXN0UHJqMy5jcmVhdGVUeXBlKG1vZGVsU3luYzMsICJXUzMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzNOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpM05hbWVcIikgcHVibGljIGNsYXNzIFdTMyB7fSIpOw0KLQkJCXRlc3RQcmozLmdldFByb2plY3QoKS5jbG9zZShudWxsKTsNCi0JCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJCQ0KLQkJCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCQl0ZXN0UHJqMy5nZXRQcm9qZWN0KCkub3BlbihudWxsKTsNCi0JCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJCQ0KLQkJCWFzc2VydEJlZm9yZUFmdGVyQXJlVGhlU2FtZSgpOw0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajMgPSBkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajMuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQlhc3NlcnROb3ROdWxsKCJXZWIgU2VydmljZSBQcm9qZWN0IG5vdCBzeW5jaHJvbml6ZWQgYWZ0ZXIgb3BlbmVkIix3c1ByajMpOw0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlIHdzMyA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajMsICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMy5XUzMiKTsNCi0JCQlhc3NlcnROb3ROdWxsKCJXZWIgU2VydmljZSBub3Qgc3luY2hyb25pemVkIGFmdGVyIGNvbnRhaW5pbmcgcHJvamVjdCB3YXMgb3BwZW5lZCIsIHdzMyk7DQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkzID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajMsICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMy5TZWkzIik7DQotCQkJYXNzZXJ0Tm90TnVsbCgiU2VydmljZSBFbmRwb2ludCBpbnRlcmZhY2Ugbm90IHN5bmNocm9uaXplZCBhZnRlciBjb250YWluaW5nIHByb2plY3Qgd2FzIG9wcGVuZWQiLCBzZWkzKTsNCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCXRlc3RQcmozLmRpc3Bvc2UoKTsNCi0JCX0NCi0JfQ0KLQkJDQotCXB1YmxpYyB2b2lkIHRlc3Rfb3BlbmVkUHJvamVjdFdpdGhFbnVtc0luaXRpYWx5U3luY2hlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgVGVzdFByb2plY3QgdGVzdFByajMgPSBuZXcgVGVzdFByb2plY3QobmV3IFRlc3RFamIzUHJvamVjdCgiVGVzdEVKQlByb2plY3QzIikuZ2V0UHJvamVjdCgpKTsNCi0JCXRyeSB7DQotCQkJYWxsb3dlZFByb2plY3RzLmFkZCh0ZXN0UHJqMy5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMyA9IHRlc3RQcmozLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMzIik7DQotCQkJdGVzdFByajMuY3JlYXRlVHlwZShtb2RlbFN5bmMzLCAiVGVzdEVudW0uamF2YSIsICJwdWJsaWMgZW51bSBUZXN0RW51bSB7QSwgQiwgQ30iKTsNCi0JCQl0YXJnZXQgPSBjcmVhdGVUYXJnZXQoKTsNCi0JCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJCQ0KLQkJCXRhcmdldC5sb2FkKG51bGwpOw0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajMgPSBkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajMuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQlhc3NlcnROb3ROdWxsKCJXZWIgU2VydmljZSBQcm9qZWN0IG5vdCBzeW5jaHJvbml6ZWQgYWZ0ZXIgY3JlYXRlZCIsd3NQcmozKTsNCi0JCX0gZmluYWxseSANCi0JCXsNCi0JCQl0ZXN0UHJqMy5kaXNwb3NlKCk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9uZXdTZWlDb21waWxhdGlvblVuaXRzU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCXZlcmlmeVNldFVwTW9kZWxFbnRpdGVzTm90Q2hhbmdlZCgpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwZiA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5uZXdzZWkiKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUocGYsICJTZWkzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkzTmFtZVwiLCB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vY29tLnNhcC50ZXN0L1wiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTMge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEJlZm9yZUFmdGVyQXJlVGhlU2FtZSgpOw0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMSA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkzID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubmV3c2VpLlNlaTMiKTsNCi0JCWFzc2VydE5vdE51bGwoIk5ld2x5IGFkZGVkIFNFSSBub3Qgc3luY2hlZCBpbnRvIHRoZSBtb2RlbCIsc2VpMyk7DQotCQlhc3NlcnRFcXVhbHMoIkphdmEgSW50ZiBmb3IgbmV3bHkgYWRkZWQgU0VJIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCIsICJjb20uc2FwLnRlc3QubmV3c2VpLlNlaTMiLCBzZWkzLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJUYXJnZXQgTlMgZm9yIG5ld2x5IGFkZGVkIFNFSSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQiLCAiaHR0cDovL2NvbS5zYXAudGVzdC8iLCBzZWkzLmdldFRhcmdldE5hbWVzcGFjZSgpKTsNCi0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgb2YgdGhlIG5ld2x5IGFkZGVkIHNlaSBkb2Vzbid0IG1hdGNoIiwgIlNlaTNOYW1lIiwgc2VpMy5nZXROYW1lKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfdW5yZVNvbHZlZFNlaVJlZkdldHNSZXNvbHZlZEFmdGVyU2VpQWRkZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQl7DQotCQl2ZXJpZnlTZXRVcE1vZGVsRW50aXRlc05vdENoYW5nZWQoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGYgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubmV3d3MiKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkvL01ha2UgdGhlIFdTIGJlIGNyZWF0ZWQgd2l0aCBhIHJlZmVyZW5jZSB0byAiY29tLnNhcC50ZXN0Lm5ld3NlaS5TZWkzIiB3aGljaCBkb2Vzbid0IGV4aXN0IHlldC4gDQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKHBmLCAiV1MzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MzTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5uZXdzZWkuU2VpM1wiKSBwdWJsaWMgY2xhc3MgV1MzIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRCZWZvcmVBZnRlckFyZVRoZVNhbWUoKTsNCi0JCQ0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMSA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MzID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgImNvbS5zYXAudGVzdC5uZXd3cy5XUzMiKTsNCi0JCWFzc2VydE5vdE51bGwoIldlYiBTZXJ2aWNlIG5vdCBzeW5jaHJvbml6ZWQgYWZ0ZXIgbmV3IGNvbXBpbGF0aW9uIHVuaXQgd2l0aCB3cyB3YXMgYWRkZWQiLCB3czMpOw0KLQkJLy9hZGQgYSBuZXcgc2VpIGFuZCB0ZXN0IHRoYXQgaXQgaGFzIGJlZW4gc3luY2hlZC4NCi0JCXRlc3RfbmV3U2VpQ29tcGlsYXRpb25Vbml0c1N5bmNoZWQoKTsNCi0JCS8vbm93IGNoZWNrIHRhaHQgdGhlIFNlaSByZWYgaW4gd3MzIGhhcyBiZWVuIHByb3Blcmx5IHJlc29sdmVkDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG5ld2x5QWRkZWRTZWkgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgImNvbS5zYXAudGVzdC5uZXdzZWkuU2VpMyIpOw0KLQkJYXNzZXJ0Tm90TnVsbCgiTmV3bHkgYWRkZWQgc2VpIG5vdCBmb3VuZCBpbiB0aGUgbW9kZWwuIFByb2JhYmx5IHRoZSB0ZXN0X25ld1NlaUNvbXBpbGF0aW9uVW5pdHNTeW5jaGVkKCkgdGVzdCBtZXRob2QgaGFzIGNoYW5nZWQgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSBpdCB3b3JrcyB3aXRoIiwgbmV3bHlBZGRlZFNlaSk7DQotCQlhc3NlcnRTYW1lKCJXZWIgU2VydmljZSBSZWZlcmVuY2Ugbm90IHJlc29sdmVkIHByb3Blcmx5IiwgbmV3bHlBZGRlZFNlaSwgd3MzLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9uZXdTb3VyY2VGb2xkZXJXaXRoSmF2YUNvbnRlbnRTeW5jaGVkV2hlbkFkZGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkvLwl2ZXJpZnlTZXRVcE1vZGVsRW50aXRlc05vdENoYW5nZWQoKTsNCi0JCS8vY3JlYXRlIG5ldyBmb2xkZXIsIHdoaWNoIHdpbGwgbGF0ZXIgb24gYmUgbWFkZSBhIHNvdXJlIGZvbGRlcg0KLQkJSUZvbGRlciBmb2xkZXIgPSB0ZXN0UHJqMS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMxIik7DQotCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOw0KLQkJLy9tYWtlIHRoZSBmb2xkZXIgYSBzb3VyY2UgZm9sZGVyIG5vdyBpbiBvcmRlciB0byBjcmVhdGUgdGhlIHR5cGUgaW4gdGhlcmUuDQotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRSYXdDbGFzc3BhdGgoKTsNCi0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoICsgMV07DQotCQkvL2NyZWF0ZSBhIG5ldyBwYWNrYWdlIGZyYWdtZW50IGZvbGRlci4gTm90ZSBodGF0IGl0IGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSB0eXBlLCBhcyB0aGUgZm9sZGVyIGlzIG5vdCBzb3VyY2UgZm9sZGVyIHlldA0KLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCBuZXdTb3VyY2VGb2xkZXIgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZm9sZGVyKTsNCi0JCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3U291cmNlRm9sZGVyLmdldFBhdGgoKSk7DQotCQl0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLnNldFJhd0NsYXNzcGF0aChuZXdFbnRyaWVzLCBudWxsKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGYgPSBuZXdTb3VyY2VGb2xkZXIuY3JlYXRlUGFja2FnZUZyYWdtZW50KCJjb20uc2FwLnRlc3QubmV3d3MiLCB0cnVlLCBudWxsKTsNCi0JCS8vbm93IGNyZWF0ZSB0aGUgdHlwZXMNCi0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUocGYsICJXUzMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzNOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm5ld3NlaS5TZWkzXCIpIHB1YmxpYyBjbGFzcyBXUzMge30iKTsNCi0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUocGYsICJTZWkzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkzTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTMge30iKTsNCi0JCS8vYWZ0ZXIgdGhlIHR5cGUgaXMgY3JlYXRlZCBtYWtlIHRoZSBzb3VyY2UgZm9sZGVyIGFuIG9yZGluYXJ5IHNvdXJjZSBhZ2Fpbi4gDQotCQl0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLnNldFJhd0NsYXNzcGF0aChvbGRFbnRyaWVzLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkvL3RoZW4gc3RhcnQgc3luY2hyb25pemluZw0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJLy9maW5hbGx5IHRoZSByZXNvdXJjZSBpcyBzeWNobnJvbml6aW5nIGFuZCBpbiB0aGUgc2FtZSB0aW1lIHdlIGhhdmUgYSBmb2xkZXIgd2l0aCBzb3VyY2UgY29udGVudC4gU28ganVzdCBtYWtlIGl0IGEgc291cmNlIGZvbGRlciBhZ2Fpbi4NCi0JCXRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMSA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MzID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgImNvbS5zYXAudGVzdC5uZXd3cy5XUzMiKTsNCi0JCWFzc2VydE5vdE51bGwoIldlYiBTZXJ2aWNlIG5vdCBzeW5jaHJvbml6ZWQgYWZ0ZXIgYSBzb3VyY2UgZm9sZGVyIGluIHdoaWNoIGl0IHdhcyBjb250YWluZWQgd2FzIGFkZGVkIiwgd3MzKTsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpMyA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm5ld3dzLlNlaTMiKTsNCi0JCWFzc2VydE5vdE51bGwoIlNlaSBub3Qgc3luY2hlZCBhZnRlciBhIHNvdXJjZSBmb2xkZXIgaW4gd2hpY2ggaXQgd2FzIGNvbnRhaW5lZCB3YXMgYWRkZWQiLCBzZWkzKTsNCi0JCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZWRTb3VyY2VGb2xkZXJTeWNoZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJdGVzdF9uZXdTb3VyY2VGb2xkZXJXaXRoSmF2YUNvbnRlbnRTeW5jaGVkV2hlbkFkZGVkKCk7DQotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRSYXdDbGFzc3BhdGgoKTsNCi0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdICBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCAtIDFdOw0KLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLmxlbmd0aCk7DQotCQl0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLnNldFJhd0NsYXNzcGF0aChuZXdFbnRyaWVzLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgImNvbS5zYXAudGVzdC5uZXd3cy5XUzMiKSk7DQotCQlhc3NlcnROdWxsKGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm5ld3dzLlNlaTMiKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlZE9yQ2xvc2VkUHJvamVjdFN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxXzEiKTsNCi0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTM05hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMl8xLlNlaTNcIikgcHVibGljIGNsYXNzIFdTMyB7fSIpOw0KLQkNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMiA9IHRlc3RQcmoyLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMyXzEiKTsNCi0JCXRlc3RQcmoyLmNyZWF0ZVR5cGUobW9kZWxTeW5jMiwgIlNlaTMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTNOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMyB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJDQotCQlmaW5hbCBJV2ViU2VydmljZSB3czMgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzFfMS5XUzMiKTsNCi0JCWFzc2VydE5vdE51bGwod3MzKTsNCi0JCQ0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkzID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajIsICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMl8xLlNlaTMiKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpMyk7DQotCQlhc3NlcnRFcXVhbHMoc2VpMywgd3MzLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCWZpbmFsIFN0cmluZyB0ZXN0UHJqMk5hbWUgPSB0ZXN0UHJqMi5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCk7DQotCQl0ZXN0UHJqMi5nZXRQcm9qZWN0KCkuY2xvc2UobnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJYXNzZXJ0TnVsbChkb21VdGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByajJOYW1lKSk7DQotCQlhc3NlcnROdWxsKCJUaGUgd2ViIHNlcnZpY2UgcmV0dXJucyBhIHNlaSBpbnN0YW5jZSB3aGljaCBpcyBjb250YWluZWQgaW4gYSBjbG9zZWQgcHJvamVjdCIsIHdzMy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlZENVV2l0aFNlaVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2VpMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxSW1wbE5hbWUpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJc2VpMUNVLmRlbGV0ZSh0cnVlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEZhbHNlKHdzUHJqMS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuY29udGFpbnMoc2VpMSkpOw0KLQkJYXNzZXJ0TnVsbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2RlbGV0ZWRDVVdpdGhXU1N5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3MxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXdzMUNVLmRlbGV0ZSh0cnVlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEZhbHNlKHdzUHJqMS5nZXRXZWJTZXJ2aWNlcygpLmNvbnRhaW5zKHdzMSkpOw0KLQkJYXNzZXJ0RmFsc2Uoc2VpMS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmNvbnRhaW5zKHdzMSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlZEN1Q29udGVudFdpdGhTZWlTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNlaTFDdSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoc2VpMUltcGxOYW1lKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDdSwgIiIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0RmFsc2Uod3NQcmoxLmdldFdlYlNlcnZpY2VzKCkuY29udGFpbnMoc2VpMSkpOw0KLQkJYXNzZXJ0TnVsbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2RlbGV0ZWRDdUNvbnRlbnRXaXRoV3NTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czFJbXBsTmFtZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czFDVSwgIiIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0RmFsc2Uod3NQcmoxLmdldFdlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7DQotCQlhc3NlcnRGYWxzZShzZWkxLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X21vdmVkQ1VXaXRoV1NJbk90aGVyUHJvamVjdFdpdGhTYW1lSmF2YU5hbWVTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czFJbXBsTmFtZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vdmVJbiA9IHRlc3RQcmoyLmdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudCh3czFDVS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpLCB0cnVlLCBudWxsKTsNCi0JCXdzMUNVLm1vdmUobW92ZUluLCBudWxsLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRGYWxzZSh3c1ByajEuZ2V0V2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsNCi0JCWFzc2VydFRydWUod3NQcmoyLmdldFdlYlNlcnZpY2VzKCkuY29udGFpbnMod3MxKSk7DQotCQlhc3NlcnRUcnVlKHNlaTEuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jb250YWlucyh3czEpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9tb3ZlZENVV2l0aFNlaUluT3RoZXJQcm9qZWN0V2l0aFNhbWVKYXZhTmFtZVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2UxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTFJbXBsTmFtZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vdmVJbiA9IHRlc3RQcmoyLmdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChzZTFDVS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpLCB0cnVlLCBudWxsKTsNCi0JCXNlMUNVLm1vdmUobW92ZUluLCBudWxsLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRGYWxzZSh3c1ByajEuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmNvbnRhaW5zKHNlaTEpKTsNCi0JCWFzc2VydFRydWUod3NQcmoyLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5jb250YWlucyhzZWkxKSk7DQotCQlhc3NlcnRTYW1lKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgc2VpMSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfcmVuYW1lZENVV2l0aFNlaVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2UxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTFJbXBsTmFtZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlzZTFDVS5maW5kUHJpbWFyeVR5cGUoKS5yZW5hbWUoIlNlaTFOZXdOYW1lIiwgZmFsc2UsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2UxQ1VSZW5hbWVkID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMU5ld05hbWUiKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJTZWkxTmV3TmFtZS5qYXZhIiwgc2UxQ1VSZW5hbWVkLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSByZW5hbWVkU2VpMSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZTFDVVJlbmFtZWQuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChyZW5hbWVkU2VpMSk7DQotCQlhc3NlcnROdWxsKHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9yZW5hbWVkQ1VXaXRoV1NTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czFJbXBsTmFtZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl3czFDVS5maW5kUHJpbWFyeVR5cGUoKS5yZW5hbWUoIldTMU5ld05hbWUiLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3czFDVVJlbmFtZWQgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5XUzFOZXdOYW1lIikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkNCi0JCWFzc2VydEVxdWFscygiV1MxTmV3TmFtZS5qYXZhIiwgd3MxQ1VSZW5hbWVkLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJSVdlYlNlcnZpY2UgcmVuYW1lZFdTMSA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzMUNVUmVuYW1lZC5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKHJlbmFtZWRXUzEpOw0KLQkJYXNzZXJ0RmFsc2Uoc2VpMS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmNvbnRhaW5zKHdzMSkpOw0KLQkJYXNzZXJ0VHJ1ZShzZWkxLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuY29udGFpbnMocmVuYW1lZFdTMSkpOw0KLQkJYXNzZXJ0U2FtZShzZWkxLCByZW5hbWVkV1MxLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9yZW1vdmVkV1NBbm5vdGF0aW9uRnJvbVNlaVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2UxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTFJbXBsTmFtZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZTFDVSwgInB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaTFJbXBsTmFtZSkpOw0KLQkJYXNzZXJ0TnVsbCh3czEuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZWRXU0Fubm90YXRpb25Gcm9tV1NTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHNlMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czFJbXBsTmFtZSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZTFDVSwgInB1YmxpYyBjbGFzcyBXUzEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlhc3NlcnROdWxsKGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCB3czFJbXBsTmFtZSkpOw0KLQkJYXNzZXJ0VHJ1ZShzZWkxLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuc2l6ZSgpID09IDApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2FkZGVkV1NBbm5vdGFpb25Ub0NsYXNzU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmM0ID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzQiKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3M0Q1UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzQsICJXUzQuamF2YSIsICJwdWJsaWMgY2xhc3MgV1M0IHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czRDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTNE5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxXCIsIHBvcnROYW1lPVwiVGVzdFBvcnROYW1lXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9jb20uc2FwL3Rlc3RcIiwgd3NkbExvY2F0aW9uPVwiQzovdGVzdC93c2RsL2xvY2F0aW9uXCIpIHB1YmxpYyBjbGFzcyBXUzQge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIGFkZGVkV1M0ID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3M0Q1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGRlZFdTNCk7DQotCQlhc3NlcnRUcnVlKGFkZGVkV1M0LmdldFNlcnZpY2VFbmRwb2ludCgpID09IHNlaTEpOw0KLQkJYXNzZXJ0RXF1YWxzKCJwb3J0TmFtZSBub3Qgc2FtZSIsICJUZXN0UG9ydE5hbWUiLCBhZGRlZFdTNC5nZXRQb3J0TmFtZSgpKTsNCi0JCWFzc2VydEVxdWFscygidGFyZ2V0TmFtZXNwYWNlIG5vdCBzYW1lIiwgImh0dHA6Ly9jb20uc2FwL3Rlc3QiLCBhZGRlZFdTNC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoIndzZGxMb2NhdGlvbiBub3Qgc2FtZSIsICJDOi90ZXN0L3dzZGwvbG9jYXRpb24iLCBhZGRlZFdTNC5nZXRXc2RsTG9jYXRpb24oKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfYWRkZWRXU0Fubm90YXRpb25Ub1NlaVN5bmNoZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jNCA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmM0Iik7DQotCQkNCi0JCWZpbmFsIElUeXBlIHdzNFR5cGUgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzQsICJXUzQuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzROYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzQuU2VpNFwiKSBwdWJsaWMgY2xhc3MgV1M0IHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJV2ViU2VydmljZSB3czQgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwod3M0KTsNCi0JCWFzc2VydE51bGwod3M0LmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZWk0Q1UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzQsICJTZWk0LmphdmEiLCAicHVibGljIGludGVyZmFjZSBTZWk0IHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWk0Q1UsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTROYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpNCB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBhZGRlZFdTNCA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZWk0Q1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGRlZFdTNCk7DQotCQlhc3NlcnRTYW1lKHdzNC5nZXRTZXJ2aWNlRW5kcG9pbnQoKSwgYWRkZWRXUzQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRTZWlSZWZTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMi5TZWkyXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydFNhbWUoc2VpMiwgd3MxLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCWFzc2VydFNhbWUod3MxLCBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRTZWlSZWZXaXRoVW54ZXNpc3RpbmdTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3czFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMi5TZWlVbmV4aXN0aW5nXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydE51bGwod3MxLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCWFzc2VydFNhbWUod3MxLCBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkRnJvbUV4cGxpY2l0VG9JbXBsaWNpdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3czFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3MxQ1UsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIG5hbWU9XCJJbXBsaWNpdEludGVyZmFjZU5hbWVcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90U2FtZShzZWkyLCB3czEuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3czEuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKTsNCi0JCWFzc2VydEVxdWFscygiSW1wbGljaXRJbnRlcmZhY2VOYW1lIiwgd3MxLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldE5hbWUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfZGVsZXRlZFBhY2thZ2VTeW5jaGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMzID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzMiKTsNCi0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMywgIldTNC5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxXCIpIHB1YmxpYyBjbGFzcyBXUzQge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzNCA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMy5XUzQiKTsNCi0JCWFzc2VydE5vdE51bGwod3M0KTsNCi0JCWFzc2VydFNhbWUoc2VpMSwgd3M0LmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgcGYgPSB0ZXN0UHJqMS5nZXRTb3VyY2VGb2xkZXIoKS5nZXRQYWNrYWdlRnJhZ21lbnQoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxIik7DQotCQlwZi5kZWxldGUodHJ1ZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnROdWxsKGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZWkxSW1wbE5hbWUpKTsNCi0JCWFzc2VydE51bGwoZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3MxSW1wbE5hbWUpKTsNCi0JCWFzc2VydE51bGwod3M0LmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9hZGRlZFBhY2thZ2VXaXRoQ29tcGlsYXRpb25Vbml0c1N5bmNoZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgRmlsZSBpb1BhY2thZ2UgPSBuZXcgRmlsZSh0ZXN0UHJqMS5nZXRTb3VyY2VGb2xkZXIoKS5nZXRSZXNvdXJjZSgpLmdldFJhd0xvY2F0aW9uKCkudG9PU1N0cmluZygpLCAiY29tL3NhcC90ZXN0L21vZGVsc3luYzQiKTsNCi0JCWlvUGFja2FnZS5ta2RpcnMoKTsNCi0JCWZpbmFsIEZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIobmV3IEZpbGUoaW9QYWNrYWdlLCAiV1M0LmphdmEiKSk7DQotCQl0cnkgew0KLQkJCXdyaXRlci53cml0ZSgicGFja2FnZSBjb20uc2FwLnRlc3QubW9kZWxzeW5jNDtcbiBAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMVwiKSBwdWJsaWMgY2xhc3MgV1M0IHt9Iik7DQotCQkJd3JpdGVyLmZsdXNoKCk7DQotCQl9IGZpbmFsbHkgDQotCQl7DQotCQkJd3JpdGVyLmNsb3NlKCk7DQotCQl9DQotCQl0ZXN0UHJqMS5nZXRTb3VyY2VGb2xkZXIoKS5nZXRSZXNvdXJjZSgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsICJjb20uc2FwLnRlc3QubW9kZWxzeW5jNC5XUzQiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkQ2xhc3NUb0ludGVyZmFjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzQiKTsJCQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMsICJXUzQuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgY2xhc3MgV1M0IHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJSVdlYlNlcnZpY2Ugd3M0ID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3NDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzNCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3c0NVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBXUzQge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQl3czQgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3c0NVLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCWFzc2VydE51bGwod3M0KTsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkpOw0KLQkJYXNzZXJ0RmFsc2Uoc2VpLmlzSW1wbGljaXQoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkSW50ZXJmYWNlVG9DbGFzcygpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzQiKTsJCQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMsICJXUzQuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFdTNCB7fSIpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgd3NDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKHNlaSk7DQotCQlhc3NlcnRGYWxzZShzZWkuaXNJbXBsaWNpdCgpKTsJCQ0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3NDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBjbGFzcyBXUzQge30iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCXNlaSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCB3c0NVLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpKTsNCi0JCWFzc2VydFRydWUoc2VpLmlzSW1wbGljaXQoKSk7DQotCQlJV2ViU2VydmljZSB3czQgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3c0NVLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCWFzc2VydE5vdE51bGwod3M0KTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkSW50ZXJmYWNlQW5kQ2xhc3NXaXRoU2ltaWxhck5hbWVzTm90UmVtb3ZlZEZyb21Eb20oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYyA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmM1Iik7CQkNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3NDVSA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jLCAiVGVzdC5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBjbGFzcyBUZXN0IHt9IikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKTsJCQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZWlDVSA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jLCAiVGVzdFNlaS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBpbnRlcmZhY2UgVGVzdFNlaSB7fSIpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWFzc2VydE5vdE51bGwoZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaUNVLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSk7DQotCQkNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHdzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJUZXN0U2VydmljZVwiKSBwdWJsaWMgY2xhc3MgVGVzdCB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWFzc2VydE5vdE51bGwoZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaUNVLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKTsJCQ0KLQl9CQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X1dzQ2hhbmdlZFRvVXNlRXhwbGljaXRTRUkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYyA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmM0Iik7CQkNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3NDVSA9IHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jLCAiV1M0LmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGNsYXNzIFdTNCB7fSIpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkpOw0KLQkJYXNzZXJ0VHJ1ZShzZWkuaXNJbXBsaWNpdCgpKTsJCQ0KLQkJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3c0NVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMVwiKSBwdWJsaWMgY2xhc3MgV1M0IHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJc2VpID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHdzQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJYXNzZXJ0TnVsbChzZWkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfV3NPcGVuZWRJbldvcmtpbmdDb3B5Q29udGVudENoYW5nZWRSZWNvbmNpbGVDYWxsZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7CQ0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jNCIpOwkJDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzQ3UgPSB0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYywgIldTMy5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBjbGFzcyBXUzMge30iKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQlJV2ViU2VydmljZSB3czMgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3c0N1LmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKDAsIHdzMy5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXRXZWJNZXRob2RzKCkuc2l6ZSgpKTsNCi0JCS8vIHVwZGF0ZSBjb21waWxhdGlvbiB1bml0IHdpdGhvdXQgdXBkYXRpbmcgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UNCi0JCXdzQ3UuYmVjb21lV29ya2luZ0NvcHkobnVsbCk7DQotCQl3c0N1LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKCJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGNsYXNzIFdTMyB7IiArDQotCQkJCSJwdWJsaWMgdm9pZCB0ZXN0KCkge30iICsNCi0JCQkJIn0iKTsNCi0JCXdzQ3UucmVjb25jaWxlKElDb21waWxhdGlvblVuaXQuTk9fQVNULCBmYWxzZSwgbnVsbCwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoMSwgd3MzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldFdlYk1ldGhvZHMoKS5zaXplKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X1dzT3BlbmVkSW5Xb3JraW5nQ29weUNvbnRlbnRDaGFuZ2VkUmVjb25jaWxlQ2FsbGVkT25Ob25KYXZhQ1UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7CQ0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJDQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQlJUGFja2FnZUZyYWdtZW50IHBmID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpOw0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHBmLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiTm90V1MuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGNsYXNzIE5vdFdTIHt9IiwgdHJ1ZSwgbnVsbCk7DQotCQljdS5iZWNvbWVXb3JraW5nQ29weShudWxsKTsNCi0JCWN1LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKCJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJOZXdOb3RXc1wiKSBwdWJsaWMgY2xhc3MgTm90V1Mge30iKTsNCi0JCWN1LnJlY29uY2lsZShJQ29tcGlsYXRpb25Vbml0Lk5PX0FTVCwgZmFsc2UsIG51bGwsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZm9yIChJV2ViU2VydmljZSB3cyA6IHdzUHJqMS5nZXRXZWJTZXJ2aWNlcygpKSB7DQotCQkJaWYgKHdzLmdldE5hbWUoKS5lcXVhbHMoIk5ld05vdFdzIikpIHsNCi0JCQkJZmFpbCgicmVjb25jaWxlIG9uIGphdmEgZmlsZSB3aGljaCBpcyBub3Qgb24gcHJvamVjdCdzIGJ1aWxkIHBhdGggcHJvY2Vzc2VkIGluY29ycmVjdGx5Iik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlVGFyZ2V0KCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCkgDQotCQl7DQotDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZVByb2plY3QoSUphdmFQcm9qZWN0IHByaikgew0KLQkJCQlmb3IgKFN0cmluZyBhbGxvd2VkUHJqIDogYWxsb3dlZFByb2plY3RzKQ0KLQkJCQl7DQotCQkJCQlpZiAocHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGFsbG93ZWRQcmopKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiB0cnVlOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXRVcE1vZGVsRW50aXRlc05vdENoYW5nZWQoKQ0KLQl7DQotCQlmaW5hbCBBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQWRhcHRlckltcGwoKQ0KLQkJew0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykNCi0JCQl7DQotCQkJCWZhaWwoInNob3VsZCBub3QgYmUgY2FsbGVkLCBiZWNhdXNlIHRoZSBvYmplY3RzIGNyZWF0ZWQgaW4gdGhlIHNldHVwIHNob3VsZCBub3QgaGF2ZSBiZWVuIGNoYW5nZWQgZHVyaW5nIHRoaXMgdGVzdCIpOw0KLQkJCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7DQotCQkJfQ0KLQkJCQ0KLQkJfTsNCi0JCXRoaXMud3MxLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsNCi0JCXRoaXMuc2VpMS5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7DQotCQl0aGlzLndzMi5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7DQotCQl0aGlzLnNlaTIuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL09uRXZlbnRNb2RlbFN5bmNyb25pemVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY3Jvbml6ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkNDc2Y2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY3Jvbml6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYy5PbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIE9uRXZlbnRNb2RlbFN5bmNyb25pemVyVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q2hhbmdlZFJlc291cmNlTG9hZENoYW5nZWQoKQ0KLQl7DQotCQlKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UobnVsbCkgew0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBib29sZWFuIGlzTG9hZENuYWNlbGVkKCkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9IDsNCi0JCQ0KLQkJT25FdmVudE1vZGVsU3luY2hyb25pemVyIHN5bmMgPSBuZXcgT25FdmVudE1vZGVsU3luY2hyb25pemVyKHJlc291cmNlLCBudWxsKTsNCi0JCS8vIGluIGNhc2UgcmVzb3VyY2UgbG9hZCBjYW5jZWwgaXMgbm90IHByb2Nlc3NlZCBjYWxsIHRvIGVsZW1lbnQgZGVsdGEgd2lsbCBmYWlsIHdpdGggTlBFDQotCQlzeW5jLmVsZW1lbnRDaGFuZ2VkKG51bGwpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHdWVzc1ByaW1hcnlUeXBlTmFtZUN1SW5EZWZhdWx0UGFja2FnZSgpDQotCXsNCi0JCWZpbmFsIE1vY2s8SUphdmFNb2RlbD4gamF2YU1vZGVsID0gbW9jayhJSmF2YU1vZGVsLmNsYXNzKTsNCi0JCWZpbmFsIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwucHJveHkoKSk7DQotCQkNCi0JCWZpbmFsIE1vY2s8SUphdmFFbGVtZW50PiBwYXJlbnQgPSBtb2NrKElKYXZhRWxlbWVudC5jbGFzcyk7DQotCQlwYXJlbnQuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0RWxlbWVudE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCIiKSk7DQotCQkNCi0JCWZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSAiTXlUZXN0IjsNCi0JCWZpbmFsIE1vY2s8SUNvbXBpbGF0aW9uVW5pdD4gY3UgPSBtb2NrKElDb21waWxhdGlvblVuaXQuY2xhc3MpOw0KLQkJY3UuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0UGFyZW50Iikud2lsbChyZXR1cm5WYWx1ZShwYXJlbnQucHJveHkoKSkpOw0KLQkJY3UuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0RWxlbWVudE5hbWUiKS53aWxsKHJldHVyblZhbHVlKGNsYXNzTmFtZSArICIuamF2YSIpKTsNCi0NCi0JCWZpbmFsIE15T25FdmVudE1vZGVsU3luY2hyb25pemVyIHN5bmMgPSBuZXcgTXlPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIocmVzb3VyY2UsIG51bGwpOw0KLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbmFtZSBndWVzc2VkIiwgY2xhc3NOYW1lLCBzeW5jLmd1ZXNzUHJpbWFyeVR5cGVOYW1lKGN1LnByb3h5KCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEd1ZXNzUHJpbWFyeVR5cGVOYW1lQ3VJblNvbWVQYWNrYWdlKCkNCi0Jew0KLQkJZmluYWwgTW9jazxJSmF2YU1vZGVsPiBqYXZhTW9kZWwgPSBtb2NrKElKYXZhTW9kZWwuY2xhc3MpOw0KLQkJZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbC5wcm94eSgpKTsNCi0JCQ0KLQkJZmluYWwgU3RyaW5nIHBhY2sgPSAiY29tLnNhcC5kZW1vIjsNCi0JCWZpbmFsIE1vY2s8SUphdmFFbGVtZW50PiBwYXJlbnQgPSBtb2NrKElKYXZhRWxlbWVudC5jbGFzcyk7DQotCQlwYXJlbnQuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0RWxlbWVudE5hbWUiKS53aWxsKHJldHVyblZhbHVlKHBhY2spKTsNCi0JCQ0KLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9ICJNeVRlc3QiOw0KLQkJZmluYWwgTW9jazxJQ29tcGlsYXRpb25Vbml0PiBjdSA9IG1vY2soSUNvbXBpbGF0aW9uVW5pdC5jbGFzcyk7DQotCQljdS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXRQYXJlbnQiKS53aWxsKHJldHVyblZhbHVlKHBhcmVudC5wcm94eSgpKSk7DQotCQljdS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXRFbGVtZW50TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoY2xhc3NOYW1lICsgIi5qYXZhIikpOw0KLQ0KLQkJZmluYWwgTXlPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIgc3luYyA9IG5ldyBNeU9uRXZlbnRNb2RlbFN5bmNocm9uaXplcihyZXNvdXJjZSwgbnVsbCk7DQotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBuYW1lIGd1ZXNzZWQiLCBwYWNrICsgIi4iICsgY2xhc3NOYW1lLCBzeW5jLmd1ZXNzUHJpbWFyeVR5cGVOYW1lKGN1LnByb3h5KCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFJlY3Vyc2V2aWx5SGFuZGxlQWRkZWRQYWNrYWdlc0RvZXNOb3RQcm9jZXNzTm9uV3NQcm9qZWN0cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgTW9jazxJSmF2YU1vZGVsPiBqYXZhTW9kZWwgPSBtb2NrKElKYXZhTW9kZWwuY2xhc3MpOw0KLQkJZmluYWwgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbC5wcm94eSgpKTsNCi0JCWZpbmFsIE15T25FdmVudE1vZGVsU3luY2hyb25pemVyIHN5bmMgPSBuZXcgTXlPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIocmVzb3VyY2UsIG51bGwpOw0KLQkJZmluYWwgTW9jazxJSmF2YUVsZW1lbnREZWx0YT4gZGVsdGEgPSBtb2NrKElKYXZhRWxlbWVudERlbHRhLmNsYXNzKTsNCi0JCS8vIGl0IGlzIGV4cGVjdGVkIHRoYXQgSUphdmFFbGVtZW50RGVsdGEjZ2V0QWZmZWN0ZWRDaGlsZHJlbigpIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQNCi0JCXN5bmMucmVjdXJzZXZpbHlIYW5kbGVBZGRlZFBhY2thZ2VzKGRlbHRhLnByb3h5KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgY2xhc3MgTXlPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXIgZXh0ZW5kcyBPbkV2ZW50TW9kZWxTeW5jaHJvbml6ZXINCi0Jew0KLQkJcHVibGljIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7DQotCQkNCi0JCXB1YmxpYyBNeU9uRXZlbnRNb2RlbFN5bmNocm9uaXplcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlLCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKSB7DQotCQkJc3VwZXIocmVzb3VyY2UsIHNlcnZpY2VEYXRhKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgU3RyaW5nIGd1ZXNzUHJpbWFyeVR5cGVOYW1lKElDb21waWxhdGlvblVuaXQgY3UpIHsNCi0JCQlyZXR1cm4gc3VwZXIuZ3Vlc3NQcmltYXJ5VHlwZU5hbWUoY3UpOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCB2b2lkIHJlY3Vyc2V2aWx5SGFuZGxlQWRkZWRQYWNrYWdlcyhJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gew0KLQkJCXN1cGVyLnJlY3Vyc2V2aWx5SGFuZGxlQWRkZWRQYWNrYWdlcyhyb290RGVsdGEpOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZmluZFByb2plY3RCeURlbHRhKElKYXZhRWxlbWVudERlbHRhIHJvb3REZWx0YSkgew0KLQkJCXJldHVybiB3c1Byb2plY3Q7DQotCQl9DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWV0aG9kU3luY3Jvbml6YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXRob2RTeW5jcm9uaXphdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTY0ZjE0ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXRob2RTeW5jcm9uaXphdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLkRvbVRlc3RVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOw0KLQ0KLXB1YmxpYyBjbGFzcyBTZWlNZXRob2RTeW5jcm9uaXphdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotCXByaXZhdGUgVGVzdFByb2plY3QgdGVzdFByajE7IA0KLQlwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0Ow0KLQlwcml2YXRlIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgc2VpMUNVOw0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgc29tZUludGZDVTsNCi0JDQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMTsNCi0JcHJpdmF0ZSBJV2ViU2VydmljZSB3czE7DQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkxOw0KLQkNCi0JcHJpdmF0ZSBEb21UZXN0VXRpbHMgdGVzdFV0aWwgPSBuZXcgRG9tVGVzdFV0aWxzKCk7DQotCXByaXZhdGUgRG9tVXRpbCBkb21VdGlsID0gbmV3IERvbVV0aWwoKTsNCi0JCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgd3MxSW1wbE5hbWUgPSAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuV1MxIjsNCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc29tZUludGZJbXBsTmFtZSA9ICJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5Tb21lSW50ZiI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzZWkxSW1wbE5hbWUgPSAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMSI7DQotCQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JCXRhcmdldCA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCkgDQotCQl7DQotDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZVByb2plY3QoSUphdmFQcm9qZWN0IHByaikgew0KLQkJCQlyZXR1cm4gcHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJfQ0KLQkJfTsNCi0JCXRlc3RQcmoxID0gbmV3IFRlc3RQcm9qZWN0KCJUZXN0UHJvamVjdDEiKTsNCi0JCXRlc3RQcmoxLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzEgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMSIpOw0KLQkJDQotCQlzb21lSW50ZkNVID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU29tZUludGYuamF2YSIsICJwdWJsaWMgaW50ZXJmYWNlIFNvbWVJbnRme1xuIiArDQotCQkJCSJwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvbkluUGFyZW50KCk7XG4iICsNCi0JCQkJIn0iKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQ0KLQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU2VpMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxIGV4dGVuZHMgU29tZUludGYge1xuIiArDQotCQkJCSJwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvbigpO1xuIiArDQotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTmFtZVwiLCBleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb24oKTtcbiIgKw0KLQkJCQkifSIpOw0KLQkJdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiV1MxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCBlbmRwb2ludEludGVyZmFjZT1cImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxLlNlaTFcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJdGFyZ2V0LmxvYWQobnVsbCk7DQotCQlhc3NlcnRFcXVhbHMoIk9uZSBwcm9qZWN0cyB3ZXJlIGRlZmluZWQgYnV0IGEgZGlmZmVyZW50IG51bWJlciB3ZXJlIGZvdW5kIGluIHRoZSBET00iLCAxLCB0YXJnZXQuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygxLCB0YXJnZXQuZ2V0RE9NKCkuZ2V0V2ViU2VydmljZVByb2plY3RzKCkuZ2V0KDApLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRhcmdldC5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5nZXQoMCkuZ2V0V2ViU2VydmljZXMoKS5zaXplKCkpOw0KLQkJd3NQcmoxID0gZG9tVXRpbC5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXQuZ2V0RE9NKCksIHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzUHJqMSk7DQotCQl3czEgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czFJbXBsTmFtZSk7DQotCQlhc3NlcnROb3ROdWxsKHdzMSk7DQotCQlzZWkxID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajEsIHNlaTFJbXBsTmFtZSk7DQotCQlhc3NlcnROb3ROdWxsKHNlaTEpOw0KLQkJc2VpMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3ZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldE1ldGhvZCgidm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb24iLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3bSk7DQotCQlhc3NlcnRFcXVhbHMobWV0aG9kRWxlbS5nZXRFbGVtZW50TmFtZSgpLCB3bS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpKTsNCi0JCWFzc2VydEVxdWFscyhkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSwgd20uZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlhc3NlcnRGYWxzZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3ZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb25TeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW0gPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0TWV0aG9kKCJ2b2lkTWV0aG9kV2l0aE5vQXJnc1dpdGhBbm5vdGF0aW9uIiwgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pKTsNCi0JCWFzc2VydE5vdE51bGwod20pOw0KLQkJYXNzZXJ0RXF1YWxzKCJ3ZWJOYW1lIiwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7DQotCQlhc3NlcnRFcXVhbHMoZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSksIHdtLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0X3dlYk5hbWVDaGFuZ2VkU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2RFbGVtID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldE1ldGhvZCgidm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbiIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgSVdlYk1ldGhvZCB3bSA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2RFbGVtKSk7DQotCQlhc3NlcnROb3ROdWxsKHdtKTsNCi0JCWFzc2VydEVxdWFscygid2ViTmFtZSIsIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdtLmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pLCB3bS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydFRydWUod20uaXNFeGNsdWRlZCgpKTsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCUZpbGVVdGlscy5nZXRJbnN0YW5jZSgpLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoc2VpMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEge1xuIiArDQotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTmFtZU5ld1wiLCBleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb24oKTtcbiIgKw0KLQkJCQkifSIsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEVxdWFscygid2ViTmFtZU5ldyIsIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdtLmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pLCB3bS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydFRydWUod20uaXNFeGNsdWRlZCgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9leGNsdWRlZENoYW5nZWRTeW5jaGVkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZEVsZW0gPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0TWV0aG9kKCJ2b2lkTWV0aG9kV2l0aE5vQXJnc1dpdGhBbm5vdGF0aW9uIiwgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdtID0gZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pKTsNCi0JCWFzc2VydE5vdE51bGwod20pOw0KLQkJYXNzZXJ0RXF1YWxzKCJ3ZWJOYW1lIiwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSk7DQotCQlhc3NlcnRFcXVhbHMoZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kRWxlbSksIHdtLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0VHJ1ZSh3bS5pc0V4Y2x1ZGVkKCkpOw0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJRmlsZVV0aWxzLmdldEluc3RhbmNlKCkuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChzZWkxQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7XG4iICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJOYW1lXCIsIGV4Y2x1ZGU9ZmFsc2UpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzV2l0aEFubm90YXRpb24oKTtcbiIgKw0KLQkJCQkifSIsIGZhbHNlLCBudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEVxdWFscygid2ViTmFtZSIsIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdtLmdldFBhcmFtZXRlcnMoKS5pc0VtcHR5KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZEVsZW0pLCB3bS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWFzc2VydEZhbHNlKHdtLmlzRXhjbHVkZWQoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdF9kZWxldGVkTWV0aG9kU3luY2VkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZFRvRGVsZXRlID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldE1ldGhvZCgidm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb24iLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIFN0cmluZyBtZXRob2RUb0RlbGV0ZUltcGw9IGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKG1ldGhvZFRvRGVsZXRlKTsNCi0JDQotCQlGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKS5zZXRDb21waWxhdGlvblVuaXRDb250ZW50KHNlaTFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxIHtcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk5hbWVcIiwgZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc1dpdGhBbm5vdGF0aW9uKCk7XG4iICsNCi0JCQkJIn0iLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnROdWxsKGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBtZXRob2RUb0RlbGV0ZUltcGwpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9vdmVybG9hZGVkTWV0aG9kTG9hZGVkUHJvcGVybHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElNZXRob2QgbmV3TWV0aG9kID0gc2VpMUNVLmZpbmRQcmltYXJ5VHlwZSgpLmNyZWF0ZU1ldGhvZCgiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk5hbWVcIiwgZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc1dpdGhBbm5vdGF0aW9uKGludCBpKTsiLCBudWxsLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIG5ld1dlYk1ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihuZXdNZXRob2QpKTsNCi0JCWFzc2VydE5vdE51bGwobmV3V2ViTWV0aG9kKTsNCi0JCWZpbmFsIElNZXRob2Qgb2xkTWV0aG9kID0gc2VpMUNVLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgidm9pZE1ldGhvZFdpdGhOb0FyZ3NXaXRoQW5ub3RhdGlvbiIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJYXNzZXJ0Tm90U2FtZShuZXdXZWJNZXRob2QsIGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihvbGRNZXRob2QpKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfTWV0aG9kc0Zyb21TdXBlclR5cGVMb2FkZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElNZXRob2QgcGFyZW50TWV0aG9kID0gc29tZUludGZDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoInZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uSW5QYXJlbnQiLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWFzc2VydE5vdE51bGwoZG9tVXRpbC5maW5kV2ViTWV0aG9kQnlJbXBsKHNlaTEsIGRvbVV0aWwuY2FsY0ltcGxlbWVudGF0aW9uKHBhcmVudE1ldGhvZCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9PdmVycmlkZU1ldGhvZHNMb2FkZWRQcm9wZXJseSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJc2VpMUNVLmZpbmRQcmltYXJ5VHlwZSgpLmNyZWF0ZU1ldGhvZCgiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk5hbWVcIiwgZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvbkluUGFyZW50KCk7IiwgbnVsbCwgZmFsc2UsIG51bGwpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0NCi0JCWZpbmFsIElNZXRob2Qgb3ZlcnJpZGVuTWV0aG9kID0gc2VpMUNVLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgidm9pZE1ldGhvZFdpdGhOb0FyZ3NOb0Fubm90YXRpb25JblBhcmVudCIsICBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24ob3ZlcnJpZGVuTWV0aG9kKSk7DQotCQlhc3NlcnROb3ROdWxsKHdtKTsNCi0JCWFzc2VydEVxdWFscygid2ViTmFtZSIsIHdtLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKHdtLmlzRXhjbHVkZWQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfQ2hhbmdlZE1ldGhvZEluUGFyZW50SW50ZXJmYWNlU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJc29tZUludGZDVS5nZXRCdWZmZXIoKS5zYXZlKG51bGwsIGZhbHNlKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElNZXRob2QgcGFyZW50TWV0aG9kID0gc29tZUludGZDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoInZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uSW5QYXJlbnQiLCBuZXcgU3RyaW5nWzBdKTsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd20gPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24ocGFyZW50TWV0aG9kKSk7DQotCQlhc3NlcnRFcXVhbHMoInZvaWRNZXRob2RXaXRoTm9BcmdzTm9Bbm5vdGF0aW9uSW5QYXJlbnQiLCB3bS5nZXROYW1lKCkpOw0KLQkJYXNzZXJ0RmFsc2Uod20uaXNFeGNsdWRlZCgpKTsNCi0JCUZpbGVVdGlscy5nZXRJbnN0YW5jZSgpLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoc29tZUludGZDVSwgInB1YmxpYyBpbnRlcmZhY2UgU29tZUludGZ7XG4iICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJNZXRob2RJblBhcmVudENsYXNzV2l0aE5ld05hbWVcIiwgZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc05vQW5ub3RhdGlvbkluUGFyZW50KCk7XG4iICsNCi0JCQkJIn0iLCBmYWxzZSwgbnVsbCk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdtKTsNCi0JCWFzc2VydEVxdWFscygiTWV0aG9kSW5QYXJlbnRDbGFzc1dpdGhOZXdOYW1lIiwgd20uZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUod20uaXNFeGNsdWRlZCgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9DaGFuZ2VkU29hcEJpbmRpbmdTeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7CQ0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBTZWkxIHsgcHVibGljIHZvaWQgc29hcEJpbmRpbmdNZXRob2QoKTsgfSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSU1ldGhvZCBuZXdNZXRob2QgPSBzZWkxQ1UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJzb2FwQmluZGluZ01ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOw0KLQkJZmluYWwgSVdlYk1ldGhvZCBuZXdXZWJNZXRob2QgPSBkb21VdGlsLmZpbmRXZWJNZXRob2RCeUltcGwoc2VpMSwgZG9tVXRpbC5jYWxjSW1wbGVtZW50YXRpb24obmV3TWV0aG9kKSk7DQotCQlhc3NlcnROb3ROdWxsKG5ld1dlYk1ldGhvZCk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuTElURVJBTCwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nVXNlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7DQotCQkNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7IFxuIiArDQotCQkJCSJAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcoc3R5bGU9U3R5bGUuUlBDLCB1c2U9VXNlLkVOQ09ERUQsIHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLkJBUkUpXG4iICsNCi0JCQkJInB1YmxpYyB2b2lkIHNvYXBCaW5kaW5nTWV0aG9kKCk7IH0iKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLlJQQywgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuRU5DT0RFRCwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nVXNlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfU29hcEJpbmRpbmdPblNlaVN5bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ1UsICJAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcoc3R5bGU9U3R5bGUuUlBDLCB1c2U9VXNlLkVOQ09ERUQsIHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLkJBUkUpXG4iICsgDQotCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UoKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTEgeyBwdWJsaWMgdm9pZCBzb2FwQmluZGluZ01ldGhvZCgpOyB9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJTWV0aG9kIG5ld01ldGhvZCA9IHNlaTFDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoInNvYXBCaW5kaW5nTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBJV2ViTWV0aG9kIG5ld1dlYk1ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihuZXdNZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLlJQQywgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuRU5DT0RFRCwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nVXNlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfU29hcEJpbmRpbmdPblNlaU92ZXJsYXBwaW5nQW5ub3RhdGlvbk9uTWV0aG9kU3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUNVLCAiQGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKHN0eWxlPVN0eWxlLlJQQywgdXNlPVVzZS5FTkNPREVELCBwYXJhbWV0ZXJTdHlsZT1QYXJhbWV0ZXJTdHlsZS5CQVJFKVxuIiArIA0KLQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBTZWkxIHsgIiArDQotCQkJCQkiQGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKHN0eWxlPVN0eWxlLkRPQ1VNRU5ULCB1c2U9VXNlLkxJVEVSQUwsIHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLldSQVBQRUQpIiArDQotCQkJCQkicHVibGljIHZvaWQgc29hcEJpbmRpbmdNZXRob2QoKTsiICsgDQotCQkJCSJ9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJTWV0aG9kIG5ld01ldGhvZCA9IHNlaTFDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoInNvYXBCaW5kaW5nTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBJV2ViTWV0aG9kIG5ld1dlYk1ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihuZXdNZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5ULCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5MSVRFUkFMLCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELCBuZXdXZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfU29hcEJpbmRpbmdPblNlaVdyb25nT3ZlcmxhcHBpbmdBbm5vdGF0aW9uT25NZXRob2RTeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7CQ0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUNVLCAiQGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKHN0eWxlPVN0eWxlLlJQQywgdXNlPVVzZS5FTkNPREVELCBwYXJhbWV0ZXJTdHlsZT1QYXJhbWV0ZXJTdHlsZS5CQVJFKVxuIiArIA0KLQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBTZWkxIHsgIiArDQotCQkJCQkiQGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKHN0eWxlPVN0eWxlLkRPQ1VNRU5UMSwgdXNlPVVzZS5MSVRFUkFMMSwgcGFyYW1ldGVyU3R5bGU9UGFyYW1ldGVyU3R5bGUuV1JBUFBFRDEpIiArDQotCQkJCQkicHVibGljIHZvaWQgc29hcEJpbmRpbmdNZXRob2QoKTsiICsgDQotCQkJCSJ9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJTWV0aG9kIG5ld01ldGhvZCA9IHNlaTFDVS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoInNvYXBCaW5kaW5nTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7DQotCQlmaW5hbCBJV2ViTWV0aG9kIG5ld1dlYk1ldGhvZCA9IGRvbVV0aWwuZmluZFdlYk1ldGhvZEJ5SW1wbChzZWkxLCBkb21VdGlsLmNhbGNJbXBsZW1lbnRhdGlvbihuZXdNZXRob2QpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLlJQQywgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuRU5DT0RFRCwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nVXNlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSwgbmV3V2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1NlaVN5bmNyb25pemF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvU2VpU3luY3Jvbml6YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4ZWFlMWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvU2VpU3luY3Jvbml6YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7DQotDQotDQotcHVibGljIGNsYXNzIFNlaVN5bmNyb25pemF0aW9uVGVzdCBleHRlbmRzIFN5bmNocm9uaXphdGlvblRlc3RGaXh0dXJlDQotew0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkU2VpTmFtZVN5bmNoZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2VpMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUNVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGludGVyZmFjZSBTZWkxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTZWkxIiwgc2VpMS5nZXROYW1lKCkpOyAvLyBjaGVjayBkZWZhdWx0IHZhbHVlDQotCQkNCi0JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5ld05hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTZWkxTmV3TmFtZSIsIHNlaTEuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUoc2VpMS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmNvbnRhaW5zKHdzMSkpOw0KLQkJYXNzZXJ0U2FtZShzZWkxLCBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKSk7DQotCQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkU2VpVGFyZ2V0TmFtZXNwYWNlU3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJYXNzZXJ0RXF1YWxzKEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKHByajFQY2tOYW1lKSwgc2VpMS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7IC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUNCi0JCQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZWkxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyhzZWkxQ1UsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOZXdOYW1lXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9jb20uc2FwL3Rlc3RcIikgcHVibGljIGludGVyZmFjZSBTZWkxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTZWkxTmV3TmFtZSIsIHNlaTEuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFRydWUoc2VpMS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmNvbnRhaW5zKHdzMSkpOw0KLQkJYXNzZXJ0U2FtZShzZWkxLCBkb21VdGlsLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJqMSwgc2VpMS5nZXRJbXBsZW1lbnRhdGlvbigpKSk7DQotCQlhc3NlcnRFcXVhbHMoIlNFSSB0YXJnZXROYW1lc3BhY2Ugbm90IHN5bmNoZWQiLCAiaHR0cDovL2NvbS5zYXAvdGVzdCIsIHNlaTEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfU29hcEJpbmRpbmdTdHlsZUNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5ULCBzZWkxLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuTElURVJBTCwgc2VpMS5nZXRTb2FwQmluZGluZ1VzZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQsIHNlaTEuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsNCi0NCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgc2VpMUNVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShzZWkxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMoc2VpMUNVLCAiQGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKHN0eWxlPVN0eWxlLlJQQywgdXNlPVVzZS5FTkNPREVELCBwYXJhbWV0ZXJTdHlsZT1QYXJhbWV0ZXJTdHlsZS5CQVJFKSIgKyANCi0JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1N0eWxlLlJQQywgc2VpMS5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQsIHNlaTEuZ2V0U29hcEJpbmRpbmdVc2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFLCBzZWkxLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7CQkNCi0JfQ0KLS8vCQ0KLS8vCXB1YmxpYyB2b2lkIHRlc3RfTG9jYXRpb25JbnRlcmZhY2VBZGFwdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLS8vCXsNCi0vLwkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzZWkxQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHNlaTEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotLy8JCXRlc3RVdGlsLnNldENvbnRlbnRzKHNlaTFDVSwgIkBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyhzdHlsZT1TdHlsZS5SUEMsIHVzZT1Vc2UuRU5DT0RFRCwgcGFyYW1ldGVyU3R5bGU9UGFyYW1ldGVyU3R5bGUuQkFSRSkiICsgDQotLy8JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSgpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMSB7fSIpOw0KLS8vCQkNCi0vLwkJSUxvY2F0b3JBZGFwdGVyIGFkYXB0ZXIgPSAoSUxvY2F0b3JBZGFwdGVyKWZpbmRBZGFwdGVyKHNlaTEsIElMb2NhdG9yQWRhcHRlci5jbGFzcyk7DQotLy8JCWFzc2VydE5vdE51bGwoYWRhcHRlcik7DQotLy8JCUlBbm5vdGF0aW9uTG9jYXRvciBsb2NhdG9yID0gYWRhcHRlci5nZXRBbm5vdGF0aW9uTG9jYXRvcihXU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OKTsNCi0vLwkJcHJpbnRMb2NhdG9yKCJXUyIsIGxvY2F0b3IuZ2V0TG9jYXRpb24oKSk7DQotLy8JCWxvY2F0b3IgPSBhZGFwdGVyLmdldEFubm90YXRpb25Mb2NhdG9yKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX0FOTk9UQVRJT04pOw0KLS8vCQlwcmludExvY2F0b3IoIlNCIiwgbG9jYXRvci5nZXRMb2NhdGlvbigpKTsNCi0vLwkJcHJpbnRMb2NhdG9yKCJ1c2UiLCBsb2NhdG9yLmdldEF0dHJpYnV0ZU5hbWVMb2NhdGlvbigidXNlIikpOw0KLS8vCQlwcmludExvY2F0b3IoInVzZVZhbCIsIGxvY2F0b3IuZ2V0QXR0cmlidXRlVmFsdWVMb2NhdGlvbigidXNlIikpOw0KLS8vCX0NCi0vLwkNCi0vLwlwcml2YXRlIHZvaWQgcHJpbnRMb2NhdG9yKFN0cmluZyBuYW1lLCBJTG9jYXRvciBsb2NhdG9yKQ0KLS8vCXsNCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiLS0tLS0tIik7DQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihsb2NhdG9yLmdldExlbmd0aCgpKTsJCQ0KLS8vCX0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1N5bmNocm9uaXphdGlvblRlc3RGaXh0dXJlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9TeW5jaHJvbml6YXRpb25UZXN0Rml4dHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNDkwZDcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS9wZXJzaXN0ZW5jZS9zeW5jL1N5bmNocm9uaXphdGlvblRlc3RGaXh0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2UuRG9tVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdEVqYjNQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotDQotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvblRlc3RGaXh0dXJlIGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLQlwcm90ZWN0ZWQgVGVzdFByb2plY3QgdGVzdFByajE7IA0KLQlwcm90ZWN0ZWQgVGVzdFByb2plY3QgdGVzdFByajI7DQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHRhcmdldDsNCi0JcHJvdGVjdGVkIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQkNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJqMVBja05hbWUgPSAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEiOwkNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJqMlBja05hbWUgPSAiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzIiOw0KLQkNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgd3MxSW1wbE5hbWUgPSBwcmoxUGNrTmFtZSArICIuV1MxIjsNCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2VpMUltcGxOYW1lID0gcHJqMVBja05hbWUgKyAiLlNlaTEiOw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyB3czJJbXBsTmFtZSA9IHByajJQY2tOYW1lICsgIi5XUzIiOw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBzZWkySW1wbE5hbWUgPSBwcmoyUGNrTmFtZSArICIuU2VpMiI7CQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByajE7DQotCXByb3RlY3RlZCBJV2ViU2VydmljZSB3czE7DQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTE7DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqMjsNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIHdzMjsNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpMjsNCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBhbGxvd2VkUHJvamVjdHM7DQotCQ0KLQlwcm90ZWN0ZWQgRG9tVXRpbCBkb21VdGlsID0gIG5ldyBEb21VdGlsKCk7DQotCXByb3RlY3RlZCBEb21UZXN0VXRpbHMgdGVzdFV0aWwgPSAgbmV3IERvbVRlc3RVdGlscygpOw0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJYWxsb3dlZFByb2plY3RzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDMpOw0KLQkJamF2YU1vZGVsID0gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQkJdGFyZ2V0ID0gY3JlYXRlVGFyZ2V0KCk7DQotCQl0ZXN0UHJqMSA9IG5ldyBUZXN0UHJvamVjdChuZXcgVGVzdEVqYjNQcm9qZWN0KCJUZXN0UHJvamVjdDEiKS5nZXRQcm9qZWN0KCkpOw0KLQkJdGVzdFByajEuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMxIik7DQotCQlmaW5hbCBTdHJpbmcgamF2YU1vZGVsRXJyb3JNZXNzYWdlID0gIkphdmEgTW9kZWwgRXJyb3IuIEp1c3QgY3JlYXRlZCB0eXBlIG5vdCBmb3VuZCBpbiB0aGUgamF2YSBtb2RlbCI7DQotCQlhc3NlcnROb3ROdWxsKGphdmFNb2RlbEVycm9yTWVzc2FnZSwgdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMxLCAiU2VpMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxIHt9IikpOw0KLQkJYXNzZXJ0Tm90TnVsbChqYXZhTW9kZWxFcnJvck1lc3NhZ2UsIHRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMS5TZWkxXCIpIHB1YmxpYyBjbGFzcyBXUzEge30iKSk7DQotCQkJCQ0KLQkJdGVzdFByajIgPSBuZXcgVGVzdFByb2plY3QobmV3IFRlc3RFamIzUHJvamVjdCgiVGVzdFByb2plY3QyIikuZ2V0UHJvamVjdCgpKTsNCi0JCXRlc3RQcmoyLmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50IG1vZGVsU3luYzIgPSB0ZXN0UHJqMi5jcmVhdGVQYWNrYWdlKCJjb20uc2FwLnRlc3QubW9kZWxzeW5jMiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChqYXZhTW9kZWxFcnJvck1lc3NhZ2UsIHRlc3RQcmoyLmNyZWF0ZVR5cGUobW9kZWxTeW5jMiwgIlNlaTIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTJOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMiB7fSIpKTsNCi0JCWFzc2VydE5vdE51bGwoamF2YU1vZGVsRXJyb3JNZXNzYWdlLCB0ZXN0UHJqMi5jcmVhdGVUeXBlKG1vZGVsU3luYzIsICJXUzIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzJOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MyIHt9IikpOw0KLQkJDQotCQlhbGxvd2VkUHJvamVjdHMuYWRkKHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlhbGxvd2VkUHJvamVjdHMuYWRkKHRlc3RQcmoyLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQl0YXJnZXQubG9hZChudWxsKTsNCi0JCXdzUHJqMSA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1ByajEpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoMSwgd3NQcmoxLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzUHJqMS5nZXRXZWJTZXJ2aWNlcygpLnNpemUoKSk7DQotCQkJCQ0KLQkJd3MxID0gZG9tVXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJqMSwgd3MxSW1wbE5hbWUpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3czEpOw0KLQkJc2VpMSA9IGRvbVV0aWwuZmluZFNlaUJ5SW1wbE5hbWUod3NQcmoxLCBzZWkxSW1wbE5hbWUpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWkxKTsNCi0JCXdzUHJqMiA9IGRvbVV0aWwuZmluZFByb2plY3RCeU5hbWUodGFyZ2V0LmdldERPTSgpLCB0ZXN0UHJqMi5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c1ByajIpOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIHdzUHJqMi5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygxLCB3c1ByajIuZ2V0V2ViU2VydmljZXMoKS5zaXplKCkpOw0KLQkJDQotCQl3czIgPSBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoyLCB3czJJbXBsTmFtZSk7DQotCQlhc3NlcnROb3ROdWxsKHdzMik7DQotCQlzZWkyID0gZG9tVXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1ByajIsIHNlaTJJbXBsTmFtZSk7DQotCQlhc3NlcnROb3ROdWxsKHNlaTIpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgYmVmb3JlVGVzdENhc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQllbmFibGVBdXRvQnVpbGQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLCBmYWxzZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBhZnRlclRlc3RDYXNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZW5hYmxlQXV0b0J1aWxkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSwgdHJ1ZSk7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBlbmFibGVBdXRvQnVpbGQoSVdvcmtzcGFjZSB3cywgYm9vbGVhbiBlbmFibGUpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjID0gd3MuZ2V0RGVzY3JpcHRpb24oKTsNCi0JCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGVuYWJsZSk7DQotCQl3cy5zZXREZXNjcmlwdGlvbihkZXNjKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEFkYXB0ZXIgZmluZEFkYXB0ZXIoRU9iamVjdCBvYmplY3QsIENsYXNzPD8+IGNsYXp6KSB7DQotCQlmb3IgKEFkYXB0ZXIgYWRhcHRlcjogb2JqZWN0LmVBZGFwdGVycygpKSB7DQotCQkJaWYgKGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShjbGF6eikpIHsNCi0JCQkJcmV0dXJuIGFkYXB0ZXI7IA0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RvcFN5bmNocm9uaXppbmcoKTsNCi0JCXRlc3RQcmoxLmRpc3Bvc2UoKTsNCi0JCXRlc3RQcmoyLmRpc3Bvc2UoKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIGNyZWF0ZVRhcmdldCgpDQotCXsNCi0JCXJldHVybiBuZXcgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZShqYXZhTW9kZWwpIA0KLQkJew0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmVQcm9qZWN0KElKYXZhUHJvamVjdCBwcmopIHsNCi0JCQkJZm9yIChTdHJpbmcgYWxsb3dlZFByaiA6IGFsbG93ZWRQcm9qZWN0cykNCi0JCQkJew0KLQkJCQkJaWYgKHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhhbGxvd2VkUHJqKSkNCi0JCQkJCXsNCi0JCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfTsNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3BlcnNpc3RlbmNlL3N5bmMvV3NTeW5jaHJvbml6YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXphdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzg1OWU5ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXphdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20ucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7DQotDQotcHVibGljIGNsYXNzIFdzU3luY2hyb25pemF0aW9uVGVzdCBleHRlbmRzIFN5bmNocm9uaXphdGlvblRlc3RGaXh0dXJlIA0KLXsNCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkV1NuYW1lU3luY2hlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3czFDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3MxQ1UsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOZXdOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwiY29tLnNhcC50ZXN0Lm1vZGVsc3luYzEuU2VpMVwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoIldTMU5ld05hbWUiLCB3czEuZ2V0TmFtZSgpKTsNCi0JCWFzc2VydFNhbWUoc2VpMSwgd3MxLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCWFzc2VydFNhbWUod3MxLCBkb21VdGlsLmZpbmRXc0J5SW1wbE5hbWUod3NQcmoxLCB3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTmFtZU9mSW1wbGljaXRJbnRlcmZhY2UoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMyA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoImNvbS5zYXAudGVzdC5tb2RlbHN5bmMzIik7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzM0NVID0gdGVzdFByajEuY3JlYXRlVHlwZShtb2RlbFN5bmMzLCAiV1MzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MzTmFtZVwiLCBuYW1lPVwiSW1wbGljaXRJbnRlcmZhY2VOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzMge30iKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzMyA9IGRvbVV0aWwuZmluZFdzQnlJbXBsTmFtZSh3c1ByajEsIHdzM0NVLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgaW1wbFNlaSA9IHdzMy5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCWFzc2VydFRydWUoaW1wbFNlaS5pc0ltcGxpY2l0KCkpOw0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3MzQ1UsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzNOYW1lXCIsIG5hbWU9XCJJbXBsaWNpdEludGVyZmFjZU5ld05hbWVcIikgcHVibGljIGNsYXNzIFdTMyB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0U2FtZShpbXBsU2VpLCB3czMuZ2V0U2VydmljZUVuZHBvaW50KCkpOw0KLQkJYXNzZXJ0VHJ1ZShpbXBsU2VpLmlzSW1wbGljaXQoKSk7DQotCQlhc3NlcnRFcXVhbHMoIkltcGxpY2l0SW50ZXJmYWNlTmV3TmFtZSIsIGltcGxTZWkuZ2V0TmFtZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkVGFyZ2V0TmFtZXNwYWNlU3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJYXNzZXJ0RXF1YWxzKEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKHByajFQY2tOYW1lKSwgd3MxLmdldFRhcmdldE5hbWVzcGFjZSgpKTsNCi0JCQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3c0NVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiV1MxTmFtZVwiLCB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vY29tLnNhcC4vdGVzdFwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoInRhcmdldE5hbWVzcGFjZSBub3Qgc3luY2hyb25pemVkIiwgImh0dHA6Ly9jb20uc2FwLi90ZXN0Iiwgd3MxLmdldFRhcmdldE5hbWVzcGFjZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkUG9ydE5hbWVTeW5jaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQl0YXJnZXQuc3RhcnRTeW5jaHJvbml6aW5nKCk7DQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHdzQ1UgPSB0ZXN0UHJqMS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHdzMS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWFzc2VydEVxdWFscygiV1MxUG9ydCIsIHdzMS5nZXRQb3J0TmFtZSgpKTsNCi0JCQ0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3NDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShwb3J0TmFtZT1cIkNoYW5nZWRQb3J0TmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7Ow0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJwb3J0TmFtZSBub3Qgc3luY2hyb25pemVkIiwgIkNoYW5nZWRQb3J0TmFtZSIsIHdzMS5nZXRQb3J0TmFtZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkV3NkbExvY2F0aW9uU3luY2hlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB3c0NVID0gdGVzdFByajEuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh3czEuZ2V0SW1wbGVtZW50YXRpb24oKSkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlhc3NlcnRFcXVhbHMobnVsbCwgd3MxLmdldFdzZGxMb2NhdGlvbigpKTsNCi0JCQ0KLQkJdGVzdFV0aWwuc2V0Q29udGVudHMod3NDVSwgIkBqYXZheC5qd3MuV2ViU2VydmljZSh3c2RsTG9jYXRpb249XCJDOi9jaGFuZ2VkL3dzZGwvbG9jYXRpb25cIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOzsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQkNCi0JCWFzc2VydEVxdWFscygid3NkbExvY2F0aW9uIG5vdCBzeW5jaHJvbml6ZWQiLCAiQzovY2hhbmdlZC93c2RsL2xvY2F0aW9uIiwgd3MxLmdldFdzZGxMb2NhdGlvbigpKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZEltcGxpY2l0U2VpU29hcEJpbmRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3NDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3c0NVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSB3czEuZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCwgc2VpLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdVc2UuTElURVJBTCwgc2VpLmdldFNvYXBCaW5kaW5nVXNlKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCwgc2VpLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7DQotDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3c0NVLCAiQGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKHN0eWxlPVN0eWxlLlJQQywgdXNlPVVzZS5FTkNPREVELCBwYXJhbWV0ZXJTdHlsZT1QYXJhbWV0ZXJTdHlsZS5CQVJFKVxuIiArIA0KLQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKCkgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nU3R5bGUuUlBDLCBzZWkuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsNCi0JCWFzc2VydEVxdWFscyhTT0FQQmluZGluZ1VzZS5FTkNPREVELCBzZWkuZ2V0U29hcEJpbmRpbmdVc2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFLCBzZWkuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RfQ29udHJ1Y3RvcklzTm90SW5jbHVkZWRJbldlYk1ldGhvZHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXRhcmdldC5zdGFydFN5bmNocm9uaXppbmcoKTsNCi0JCWZpbmFsIElDb21waWxhdGlvblVuaXQgd3NDVSA9IHRlc3RQcmoxLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod3MxLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJDQotCQl0ZXN0VXRpbC5zZXRDb250ZW50cyh3c0NVLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKClwdWJsaWMgY2xhc3MgV1Mxe3B1YmxpYyBXUzEoKXt9O3B1YmxpYyBXUzEoU3RyaW5nIHMpe31wdWJsaWMgdm9pZCBteU1ldGhvZCgpe319Iik7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IHdzMS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCWZpbmFsIEVMaXN0PElXZWJNZXRob2Q+IG1ldGhvZHMgPSBzZWkuZ2V0V2ViTWV0aG9kcygpOw0KLQkJYXNzZXJ0RXF1YWxzKCJPbmUgbWV0aG9kIGV4cGVjdGVkIGluIHRoZSBTRUkiLCAxLCBtZXRob2RzLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVucGV4cGVjdGVkIG1ldGhvZCBuYW1lIGluIFNFSSIsICJteU1ldGhvZCIsIG1ldGhvZHMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllNmNmMDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3V0aWwvRG9tMlJlc291cmNlTWFwcGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS51dGlsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NET01SdW50aW1lRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NUnVudGltZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbTJSZXNvdXJjZU1hcHBlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RFamIzUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciB7QGxpbmsgRG9tMlJlc291cmNlTWFwcGVyfSBjbGFzcw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tMlJlc291cmNlTWFwcGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIA0KLXsNCi0JcHJpdmF0ZSBEb20yUmVzb3VyY2VNYXBwZXIgbWFwcGVyID0gRG9tMlJlc291cmNlTWFwcGVyLklOU1RBTkNFOw0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IHRlc3RQcm9qZWN0Ow0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IHRlc3RQcm9qZWN0MTsNCi0JDQotCXByaXZhdGUgSVR5cGUgc2VpVHlwZTsNCi0JcHJpdmF0ZSBJVHlwZSB3c1R5cGU7CQ0KLQlwcml2YXRlIElET00gZG9tOyANCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24JDQotCXsNCi0JCXRlc3RQcm9qZWN0ID0gcHJlcGFyZVByb2plY3QoKTsNCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGNrID0gdGVzdFByb2plY3QuY3JlYXRlUGFja2FnZSgidGVzdCIpOw0KLQkJc2VpVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUocGNrLCAiU2VpLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHsgXG4iICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kIHB1YmxpYyB2b2lkIHRlc3QoaW50IGEpOyBcbiIgKw0KLQkJCQkifSIpOw0KLQkJDQotCQl0ZXN0UHJvamVjdDEgPSBwcmVwYXJlUHJvamVjdCgpOw0KLQkJcGNrID0gdGVzdFByb2plY3QxLmNyZWF0ZVBhY2thZ2UoInRlc3QiKTsNCi0JCXdzVHlwZSA9IHRlc3RQcm9qZWN0MS5jcmVhdGVUeXBlKHBjaywgIldzLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBjbGFzcyBXcyB7fSIpOw0KLQkJDQotCQkNCi0JCWZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IFdzRE9NUnVudGltZU1hbmFnZXIuaW5zdGFuY2UoKS5nZXRET01SdW50aW1lKCJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmplZTUiKTsNCi0JCWRvbVJ1bnRpbWUuY3JlYXRlRE9NKG51bGwpOw0KLQkJZG9tID0gZG9tUnVudGltZS5nZXRET00oKTsJCQ0KLQl9DQotCQ0KLQlwcml2YXRlIFRlc3RQcm9qZWN0IHByZXBhcmVQcm9qZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlUZXN0RWpiM1Byb2plY3QgdHAgPSBuZXcgVGVzdEVqYjNQcm9qZWN0KCJFamIiKTsJCQ0KLQkJcmV0dXJuIG5ldyBUZXN0UHJvamVjdCh0cC5nZXRQcm9qZWN0KCkpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdGVhckRvd24oKQ0KLQl7DQotCQl0cnkgew0KLQkJCXRlc3RQcm9qZWN0LmRpc3Bvc2UoKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBfKSB7fQ0KLQkJdHJ5IHsNCi0JCQl0ZXN0UHJvamVjdDEuZGlzcG9zZSgpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIF8pIHt9CQkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZFByb2plY3QoKSANCi0Jew0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUoZG9tLCB0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsNCi0JCUlQcm9qZWN0IHByb2plY3QgPSBtYXBwZXIuZmluZFByb2plY3Qod3NQcm9qZWN0KTsNCi0JCWFzc2VydEVxdWFscyh0ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCksIHByb2plY3QpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kUmVzb3VyY2VTZWkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZShkb20sIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJvamVjdCwgInRlc3QuU2VpIik7DQotCQlhc3NlcnROb3ROdWxsKHNlaSk7DQotCQkNCi0JCS8vIGZpbmQgdXNpbmcgU0VJDQotCQlJVHlwZSB0eXBlID0gbWFwcGVyLmZpbmRUeXBlKHNlaSk7DQotCQlhc3NlcnROb3ROdWxsKHR5cGUpOw0KLQkJYXNzZXJ0RXF1YWxzKHNlaVR5cGUsIHR5cGUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kUmVzb3VyY2VXcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0QnlOYW1lKGRvbSwgdGVzdFByb2plY3QxLmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJSVdlYlNlcnZpY2Ugd3MgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRXc0J5SW1wbE5hbWUod3NQcm9qZWN0LCAidGVzdC5XcyIpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3cyk7DQotCQkNCi0JCUlUeXBlIHR5cGUgPSBtYXBwZXIuZmluZFR5cGUod3MpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCWFzc2VydEVxdWFscyh3c1R5cGUsIHR5cGUpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kUmVzb3VyY2VXZWJNZXRob2QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZShkb20sIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJvamVjdCwgInRlc3QuU2VpIik7DQotCQlhc3NlcnROb3ROdWxsKHNlaSk7DQotCQkNCi0JCUlUeXBlIHR5cGUgPSBtYXBwZXIuZmluZFR5cGUoc2VpLmdldFdlYk1ldGhvZHMoKS5nZXQoMCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCWFzc2VydEVxdWFscyhzZWlUeXBlLCB0eXBlKTsJCQ0KLQkJDQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJNZXRob2QoKTsgCQkJDQotCQl0eXBlID0gbWFwcGVyLmZpbmRUeXBlKHdlYk1ldGhvZCk7DQotCQlhc3NlcnROdWxsKHR5cGUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZFJlc291cmNlV2ViUGFyYW0oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZShkb20sIHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOw0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBEb21VdGlsLklOU1RBTkNFLmZpbmRTZWlCeUltcGxOYW1lKHdzUHJvamVjdCwgInRlc3QuU2VpIik7DQotCQlhc3NlcnROb3ROdWxsKHNlaSk7DQotDQotCQlJVHlwZSB0eXBlID0gbWFwcGVyLmZpbmRUeXBlKHNlaS5nZXRXZWJNZXRob2RzKCkuZ2V0KDApLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsNCi0JCWFzc2VydEVxdWFscyhzZWlUeXBlLCB0eXBlKTsJCQkNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3V0aWwvRG9tVXRpbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS91dGlsL0RvbVV0aWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjZmRkMjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3V0aWwvRG9tVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIERvbVV0aWxUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLQlwcml2YXRlIERvbVV0aWwgdXRpbDsgDQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCXV0aWwgPSBuZXcgRG9tVXRpbCgpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJc091dGlkZUluV2ViU2VydmljZSgpDQotCXsNCi0JCU1vY2s8SVdlYlNlcnZpY2U+IHdzID0gbW9jayhJV2ViU2VydmljZS5jbGFzcyk7DQotCQl3cy5zdHVicygpLm1ldGhvZCgiZ2V0V3NkbExvY2F0aW9uIikud2lsbChyZXR1cm5WYWx1ZSgiQzovdGVzdC93c2RsL2xvY2F0aW9uIikpOw0KLQkJTW9jazxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBzZWkgPSBtb2NrKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MpOw0KLQkJRUxpc3Q8SVdlYlNlcnZpY2U+IGltcGxlbWV0aW5nV3MgPSBuZXcgQmFzaWNFTGlzdDxJV2ViU2VydmljZT4oKTsNCi0JCWltcGxlbWV0aW5nV3MuYWRkKHdzLnByb3h5KCkpOw0KLQkJDQotCQlzZWkuc3R1YnMoKS5tZXRob2QoImdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzIikud2lsbChyZXR1cm5WYWx1ZShpbXBsZW1ldGluZ1dzKSk7DQotCQlhc3NlcnRUcnVlKHV0aWwuaXNPdXRzaWRlSW5XZWJTZXJ2aWNlKHNlaS5wcm94eSgpKSk7DQotCQkNCi0JCXdzLnN0dWJzKCkubWV0aG9kKCJnZXRXc2RsTG9jYXRpb24iKS53aWxsKHJldHVyblZhbHVlKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHV0aWwuaXNPdXRzaWRlSW5XZWJTZXJ2aWNlKHNlaS5wcm94eSgpKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kV3NQcm9qZWN0KCkNCi0Jew0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdCgpOw0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQlJV2ViTWV0aG9kIG1ldGhvZCA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJNZXRob2QoKTsNCi0JCXNlaS5nZXRXZWJNZXRob2RzKCkuYWRkKG1ldGhvZCk7DQotCQl3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmFkZChzZWkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMod3NQcm9qZWN0LCB1dGlsLmZpbmRXc1Byb2plY3QobWV0aG9kKSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENhbGNVbmlxdWVJbXBsKCkNCi0Jew0KLQkJSVdlYk1ldGhvZCBtZXRob2QgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCk7DQotCQltZXRob2QuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCAibWV0aG9kKEkpIik7DQotCQlJV2ViUGFyYW0gcGFyYW0gPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViUGFyYW0oKTsNCi0JCXBhcmFtLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiwgImEiKTsNCi0JCW1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKHBhcmFtKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QoSSkiLCB1dGlsLmNhbGNVbmlxdWVJbXBsKG1ldGhvZCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QoSSlbYV0iLCB1dGlsLmNhbGNVbmlxdWVJbXBsKHBhcmFtKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0Fic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwZDc3OWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vQWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuQ29uc3RyYWludFNldmVyaXR5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLklDb25zdHJhaW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLklBbm5vdGF0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLmltcGwuQWJzdHJhY3RMb2NhdG9yc1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLklDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLklQcm9ibGVtTG9jYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklMb2NhdG9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25Db25zdHJhaW50VGVzdCBleHRlbmRzIEFic3RyYWN0TG9jYXRvcnNUZXN0IA0KLXsNCi0JcHJpdmF0ZSBNeUFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQgY29uc3RyYWludDsNCi0JcHJpdmF0ZSBNb2NrPElSZXNvdXJjZT4gcmVzb3VyY2U7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlzdXBlci5zZXRVcCgpOw0KLQkJcmVzb3VyY2UgPSBtb2NrKElSZXNvdXJjZS5jbGFzcyk7CQkNCi0JCU1vY2s8SUNvbnN0cmFpbnREZXNjcmlwdG9yPiBkZXNjcmlwdG9yID0gbW9jayhJQ29uc3RyYWludERlc2NyaXB0b3IuY2xhc3MpOw0KLQkJZGVzY3JpcHRvci5zdHVicygpLm1ldGhvZCgiZ2V0UGx1Z2luSWQiKS53aWxsKHJldHVyblZhbHVlKCJwbHVnaW4uaWQiKSk7DQotCQlkZXNjcmlwdG9yLnN0dWJzKCkubWV0aG9kKCJnZXRTZXZlcml0eSIpLndpbGwocmV0dXJuVmFsdWUoQ29uc3RyYWludFNldmVyaXR5LkVSUk9SKSk7DQotCQlkZXNjcmlwdG9yLnN0dWJzKCkubWV0aG9kKCJnZXRTdGF0dXNDb2RlIikud2lsbChyZXR1cm5WYWx1ZSgtMSkpOw0KLQkJDQotCQljb25zdHJhaW50ID0gbmV3IE15QWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludChkZXNjcmlwdG9yLnByb3h5KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlT2tTdGF0dXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlJV2ViU2VydmljZSB3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7CQkNCi0JCUlDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQgY3MgPSBjb25zdHJhaW50LmNyZWF0ZU9rU3RhdHVzKHdzKTsNCi0JCWFzc2VydE5vdE51bGwoIkNvbnN0cmFpbnQgc3RhdHVzIGlzIG51bGwiLCBjcyk7DQotCQlhc3NlcnRUcnVlKGNzLmlzT0soKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgY3MuZ2V0UmVzdWx0TG9jdXMoKS5zaXplKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIGNzLmdldFByb2JsZW1Mb2NhdGlvbnMoKS5zaXplKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFcnJvclN0YXR1cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCUlXZWJTZXJ2aWNlIHdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsJCQ0KLQkJSUNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCBjcyA9IGNvbnN0cmFpbnQuY3JlYXRlU3RhdHVzKHdzLCAiZXJyb3IgbWVzc2FnZSIsIG51bGwsIG51bGwpOw0KLQkJYXNzZXJ0Tm90TnVsbChjcyk7DQotCQlhc3NlcnRGYWxzZShjcy5pc09LKCkpOyANCi0JCUlQcm9ibGVtTG9jYXRpb24gcGwgPSBjcy5nZXRQcm9ibGVtTG9jYXRpb25zKCkuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHMocmVzb3VyY2UucHJveHkoKSwgcGwuZ2V0UmVzb3VyY2UoKSk7DQotCQlhc3NlcnROb3ROdWxsKHBsLmdldExvY2F0b3IoKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgcGwuZ2V0TG9jYXRvcigpLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoMCwgcGwuZ2V0TG9jYXRvcigpLmdldExlbmd0aCgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TG9jYXRvck5vQW5ub3RhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlJV2ViU2VydmljZSB3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7CQkNCi0JCUlQcm9ibGVtTG9jYXRpb24gcGwgPSBjb25zdHJhaW50LmdldExvY2F0b3Iod3MsIG51bGwsIG51bGwpOw0KLQkJYXNzZXJ0RXF1YWxzKHJlc291cmNlLnByb3h5KCksIHBsLmdldFJlc291cmNlKCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TG9jYXRvckZvckFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlXZWJTZXJ2aWNlIHdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCU1vY2s8SUphdmFFbGVtZW50PiBqYXZhRWxlbWVudCA9IG1vY2soSUphdmFFbGVtZW50LmNsYXNzKTsNCi0JCWphdmFFbGVtZW50LnN0dWJzKCkubWV0aG9kKCJnZXRSZXNvdXJjZSIpLndpbGwocmV0dXJuVmFsdWUocmVzb3VyY2UucHJveHkoKSkpOw0KLQkJYW5ub3RhdGlvbi5zdHVicygpLm1ldGhvZCgiZ2V0QXBwbGllZEVsZW1lbnQiKS53aWxsKHJldHVyblZhbHVlKGphdmFFbGVtZW50LnByb3h5KCkpKTsNCi0JCQ0KLQkJZmluYWwgSUFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSUFubm90YXRpb25BZGFwdGVyKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdCh3cywgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCWFkYXB0ZXIuYWRkQW5ub3RhdGlvbihXU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLnByb3h5KCkpOw0KLQkJSVByb2JsZW1Mb2NhdGlvbiBwbCA9IGNvbnN0cmFpbnQuZ2V0TG9jYXRvcih3cywgV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTiwgbnVsbCk7DQotCQlhc3NlcnRFcXVhbHMocmVzb3VyY2UucHJveHkoKSwgcGwuZ2V0UmVzb3VyY2UoKSk7DQotCQlhc3NlcnRFcXVhbHMoYW5ub3RhdGlvbi5wcm94eSgpLmdldExvY2F0b3IoKSwgcGwuZ2V0TG9jYXRvcigpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldExvY2F0b3JGb3JBdHRyaWJ1dGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlXZWJTZXJ2aWNlIHdzID0gRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2UoKTsJDQotCQlNb2NrPElKYXZhRWxlbWVudD4gamF2YUVsZW1lbnQgPSBtb2NrKElKYXZhRWxlbWVudC5jbGFzcyk7DQotCQlqYXZhRWxlbWVudC5zdHVicygpLm1ldGhvZCgiZ2V0UmVzb3VyY2UiKS53aWxsKHJldHVyblZhbHVlKHJlc291cmNlLnByb3h5KCkpKTsNCi0JCWFubm90YXRpb24uc3R1YnMoKS5tZXRob2QoImdldEFwcGxpZWRFbGVtZW50Iikud2lsbChyZXR1cm5WYWx1ZShqYXZhRWxlbWVudC5wcm94eSgpKSk7DQotCQkNCi0JCWZpbmFsIElBbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKElBbm5vdGF0aW9uQWRhcHRlcilBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQod3MsIElBbm5vdGF0aW9uQWRhcHRlci5jbGFzcyk7DQotCQlhZGFwdGVyLmFkZEFubm90YXRpb24oV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTiwgYW5ub3RhdGlvbi5wcm94eSgpKTsNCi0JCUlQcm9ibGVtTG9jYXRpb24gcGwgPSBjb25zdHJhaW50LmdldExvY2F0b3Iod3MsIFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sICJwYXJhbTEiKTsNCi0JCWFzc2VydEVxdWFscyhyZXNvdXJjZS5wcm94eSgpLCBwbC5nZXRSZXNvdXJjZSgpKTsNCi0JCWFzc2VydEVxdWFscyhwYXJhbTEuZ2V0VmFsdWUoKS5nZXRMb2NhdG9yKCksIHBsLmdldExvY2F0b3IoKSk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIGNsYXNzIE15QWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnN0cmFpbnQNCi0Jew0KLQkJcHVibGljIE15QWJzdHJhY3RWYWxpZGF0aW9uQ29uc3RyYWludChJQ29uc3RyYWludERlc2NyaXB0b3IgZGVzY3JpcHRvcikgew0KLQkJCXN1cGVyKGRlc2NyaXB0b3IpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXB1YmxpYyBJQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkIGNyZWF0ZU9rU3RhdHVzKEVPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlT2tTdGF0dXMob2JqZWN0KTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgSUNvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCBjcmVhdGVTdGF0dXMoRU9iamVjdCBvYmplY3QsIFN0cmluZyBlcnJvck1lc3NhZ2UsIFN0cmluZyBhbm5GUU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlU3RhdHVzKG9iamVjdCwgZXJyb3JNZXNzYWdlLCBhbm5GUU5hbWUsIGF0dHJpYnV0ZU5hbWUpOw0KLQkJfQ0KLQkJDQotCQlAT3ZlcnJpZGUNCi0JCXByb3RlY3RlZCBJUmVzb3VyY2UgZmluZFJlc291cmNlKEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CQkJDQotCQkJcmV0dXJuIHJlc291cmNlLnByb3h5KCk7DQotCQl9DQotCQkNCi0JCXB1YmxpYyBJUHJvYmxlbUxvY2F0aW9uIGdldExvY2F0b3IoRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgYW5uRlFOYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCQkJcmV0dXJuIHN1cGVyLmdldExvY2F0b3IoZU9iamVjdCwgYW5uRlFOYW1lLCBhdHRyaWJ1dGVOYW1lKTsNCi0JCX0NCi0JCQ0KLQkJQE92ZXJyaWRlDQotCQlwcm90ZWN0ZWQgSUxvY2F0b3IgZ2V0TG9jYXRvckZvckltcGxlbWVudGF0aW9uKGZpbmFsIEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0JCXsNCi0JCQlyZXR1cm4gbmV3IElMb2NhdG9yKCkgew0KLQkJCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsgcmV0dXJuIDA7IH0NCi0JCQkJcHVibGljIGludCBnZXRTdGFydFBvc2l0aW9uKCkgeyByZXR1cm4gMDsgfQ0KLQkJCQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7IHJldHVybiAwOyB9DQotCQkJfTsNCi0JCX0NCi0NCi0JCUBPdmVycmlkZQ0KLQkJcHJvdGVjdGVkIElTdGF0dXMgZG9WYWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9Db25zdHJhaW50U3RhdHVzRXh0ZW5kZWRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9Db25zdHJhaW50U3RhdHVzRXh0ZW5kZWRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxYzc3MDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkNvbnN0cmFpbnRTZXZlcml0eTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24ubW9kZWwuSU1vZGVsQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5JQ29uc3RyYWludERlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLklQcm9ibGVtTG9jYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLmltcGwuQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWRUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLQlwcml2YXRlIE1vY2s8SVByb2JsZW1Mb2NhdGlvbj4gbG9jYXRpb25Nb2NrOyANCi0JcHJpdmF0ZSBNb2NrPElNb2RlbENvbnN0cmFpbnQ+IG1vZGVsQ29uc3RyYWludDsNCi0JcHJpdmF0ZSBNb2NrPEVPYmplY3Q+IHRhcmdldE9iamVjdDsNCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbG9jYXRpb25Nb2NrID0gbW9jayhJUHJvYmxlbUxvY2F0aW9uLmNsYXNzKTsNCi0JCW1vZGVsQ29uc3RyYWludCA9IG1vY2soSU1vZGVsQ29uc3RyYWludC5jbGFzcyk7DQotCQl0YXJnZXRPYmplY3QgPSBtb2NrKEVPYmplY3QuY2xhc3MpOw0KLQkJDQotCQlmaW5hbCBNb2NrPElDb25zdHJhaW50RGVzY3JpcHRvcj4gY29uc3RyYWludERlc2NyID0gbW9jayhJQ29uc3RyYWludERlc2NyaXB0b3IuY2xhc3MpOw0KLQkJY29uc3RyYWludERlc2NyLnN0dWJzKCkubWV0aG9kKCJnZXRTZXZlcml0eSIpLndpbGwocmV0dXJuVmFsdWUoQ29uc3RyYWludFNldmVyaXR5LkVSUk9SKSk7DQotCQljb25zdHJhaW50RGVzY3Iuc3R1YnMoKS5tZXRob2QoImdldFN0YXR1c0NvZGUiKS53aWxsKHJldHVyblZhbHVlKDApKTsNCi0JCWNvbnN0cmFpbnREZXNjci5zdHVicygpLm1ldGhvZCgiZ2V0UGx1Z2luSWQiKS53aWxsKHJldHVyblZhbHVlKCJteXRlc3RwbHVnaW5pZCIpKTsNCi0JCW1vZGVsQ29uc3RyYWludC5zdHVicygpLm1ldGhvZCgiZ2V0RGVzY3JpcHRvciIpLndpbGwocmV0dXJuVmFsdWUoY29uc3RyYWludERlc2NyLnByb3h5KCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVdpdGhOdWxsTG9jYXRpb24oKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQluZXcgQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkKG1vZGVsQ29uc3RyYWludC5wcm94eSgpLCB0YXJnZXRPYmplY3QucHJveHkoKSwgSVN0YXR1cy5PSywgMCwgIlRFU1QiLCBudWxsKTsNCi0JCQlmYWlsKCJOUEUgZXhwZWN0ZWQiKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJLy9leHBlY3RlZA0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvYmxlbUxvY2F0aW9uSW5pdGlhbGl6ZWQoKQ0KLQl7DQotCQlmaW5hbCBTZXQ8SVByb2JsZW1Mb2NhdGlvbj4gbG9jYXRpb25zICA9IG5ldyBIYXNoU2V0PElQcm9ibGVtTG9jYXRpb24+KCk7DQotCQlsb2NhdGlvbnMuYWRkKGxvY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JCQ0KLQkJZmluYWwgQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkIHN0YXR1cyA9IG5ldyBDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQobW9kZWxDb25zdHJhaW50LnByb3h5KCksIHRhcmdldE9iamVjdC5wcm94eSgpLCBJU3RhdHVzLkVSUk9SLCAwLCAiVEVTVCIsIGxvY2F0aW9ucyk7DQotCQlhc3NlcnRUcnVlKCJQcm9ibGVtIGxvY2F0aW9uIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIsIHN0YXR1cy5nZXRQcm9ibGVtTG9jYXRpb25zKCkuc2l6ZSgpID09IDEpOw0KLQkJYXNzZXJ0VHJ1ZSgiUHJvYmxlbSBsb2NhdGlvbiBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiLCBzdGF0dXMuZ2V0UHJvYmxlbUxvY2F0aW9ucygpLml0ZXJhdG9yKCkubmV4dCgpID09IGxvY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvYmxlbUxvY2F0aW9uSW5pdGlhbGl6ZWQyKCkNCi0Jew0KLQkJZmluYWwgU2V0PElQcm9ibGVtTG9jYXRpb24+IGxvY2F0aW9ucyAgPSBuZXcgSGFzaFNldDxJUHJvYmxlbUxvY2F0aW9uPigpOw0KLQkJbG9jYXRpb25zLmFkZChsb2NhdGlvbk1vY2sucHJveHkoKSk7DQotCQkNCi0JCWZpbmFsIENvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZCBzdGF0dXMgPSBuZXcgQ29uc3RyYWludFN0YXR1c0V4dGVuZGVkKG1vZGVsQ29uc3RyYWludC5wcm94eSgpLCB0YXJnZXRPYmplY3QucHJveHkoKSwgIlRFU1QiLCBsb2NhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZSgiUHJvYmxlbSBsb2NhdGlvbiBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiLCBzdGF0dXMuZ2V0UHJvYmxlbUxvY2F0aW9ucygpLnNpemUoKSA9PSAxKTsNCi0JCWFzc2VydFRydWUoIlByb2JsZW0gbG9jYXRpb24gbm90IGluaXRpYWxpemVkIHByb3Blcmx5Iiwgc3RhdHVzLmdldFByb2JsZW1Mb2NhdGlvbnMoKS5pdGVyYXRvcigpLm5leHQoKSA9PSBsb2NhdGlvbk1vY2sucHJveHkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RQcm9ibGVtTG9jYXRpb25Jc05vdE1vZGlmaWFibGUoKQ0KLQl7DQotCQlmaW5hbCBTZXQ8SVByb2JsZW1Mb2NhdGlvbj4gbG9jYXRpb25zICA9IG5ldyBIYXNoU2V0PElQcm9ibGVtTG9jYXRpb24+KCk7DQotCQlmaW5hbCBDb25zdHJhaW50U3RhdHVzRXh0ZW5kZWQgc3RhdHVzID0gbmV3IENvbnN0cmFpbnRTdGF0dXNFeHRlbmRlZChtb2RlbENvbnN0cmFpbnQucHJveHkoKSwgdGFyZ2V0T2JqZWN0LnByb3h5KCksIElTdGF0dXMuRVJST1IsIDAsICJURVNUIiwgbG9jYXRpb25zKTsNCi0JCXRyeQ0KLQkJew0KLQkJCXN0YXR1cy5nZXRQcm9ibGVtTG9jYXRpb25zKCkuYWRkKGxvY2F0aW9uTW9jay5wcm94eSgpKTsNCi0JCQlmYWlsKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCIpOyANCi0JCX0NCi0JCWNhdGNoKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJLy9leHBlY3RlZA0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODVkNzdhMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5tb2RlbC5Db25zdHJhaW50U2V2ZXJpdHk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkV2YWx1YXRpb25Nb2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Eb21WYWxpZGF0aW9uQ29uc3RyYWludERlc2NyaXB0b3I7DQotDQotcHVibGljIGNsYXNzIERvbVZhbGlkYXRpb25Db25zdHJhaW50RGVzY3JpcHRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXByaXZhdGUgRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yIGRlc2M7DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpDQotCXsNCi0JCWRlc2MgPSBuZXcgRG9tVmFsaWRhdGlvbkNvbnN0cmFpbnREZXNjcmlwdG9yKCl7DQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHtyZXR1cm4gbnVsbDt9DQotCQkJcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHtyZXR1cm4gbnVsbDt9DQotCQkJcHVibGljIENvbnN0cmFpbnRTZXZlcml0eSBnZXRTZXZlcml0eSgpIHtyZXR1cm4gbnVsbDt9DQotCQkJcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkge3JldHVybiAwO319Ow0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRvcigpDQotCXsNCi0JCWFzc2VydE51bGwoZGVzYy5nZXRCb2R5KCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChkZXNjLmdldERlc2NyaXB0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKEV2YWx1YXRpb25Nb2RlLkJBVENILCBkZXNjLmdldEV2YWx1YXRpb25Nb2RlKCkpOw0KLQkJYXNzZXJ0TnVsbChkZXNjLmdldE1lc3NhZ2VQYXR0ZXJuKCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChkZXNjLmdldE5hbWUoKSk7DQotCQlhc3NlcnRUcnVlKGRlc2MudGFyZ2V0c0V2ZW50KG51bGwpKTsNCi0JCWFzc2VydFRydWUoZGVzYy50YXJnZXRzVHlwZU9mKG51bGwpKTsJCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRvckZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0b3JGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjRjODllLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRvckZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uRG9tVmFsaWRhdG9yRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uSURvbVZhbGlkYXRvcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIERvbVZhbGlkYXRvckZhY3Rvcnl9IGNsYXNzLg0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tVmFsaWRhdG9yRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWdpc3RlcmVkVmFsaWRhdG9ycygpDQotCXsNCi0JCUNvbGxlY3Rpb248SURvbVZhbGlkYXRvcj4gdmFsaWRhdG9ycyA9IERvbVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UmVnaXN0ZXJlZFZhbGlkYXRvcnMoKTsNCi0JCWFzc2VydFRydWUoIk5vIHZhbGlkYXRvcnMgZm91bmQiLCB2YWxpZGF0b3JzLnNpemUoKSA+IDApOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0VuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9FbmRwb2ludElzU2Vzc2lvbkJlYW5Db25zdHJhaW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmViZjY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0VuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5tZXNzYWdlcy5WYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ud2Vic2VydmljZS5FbmRwb2ludElzU2Vzc2lvbkJlYW5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZG9tLnZhbGlkYXRpb24uRG9tVmFsaWRhdGlvbkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEVuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnRUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBUZXN0UHJvamVjdCBlamJQcm9qZWN0OwotCXByaXZhdGUgVGVzdFByb2plY3Qgd2ViUHJvamVjdDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VfTkFNRSA9ICJNeVRlc3RDbGFzcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVX1BBQ0tBR0UgPSAidGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVX0NPTlRFTlQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgicHVibGljIGNsYXNzIHswfSAneydwdWJsaWMgdm9pZCB0ZXN0KCkneyd9fSIsIENVX05BTUUpOwotCi0JcHJpdmF0ZSBNeUVuZHBvaW50U2Vzc2lvbkJlYW5Db25zdHJhaW50IGNvbnN0cmFpbnQ7Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlzdXBlci5zZXRVcCgpOwotCi0JCVRlc3RQcm9qZWN0c1V0aWxzLmRlbGV0ZVdvcmtzcGFjZVByb2plY3RzKCk7Ci0JCQotCQljb25zdHJhaW50ID0gbmV3IE15RW5kcG9pbnRTZXNzaW9uQmVhbkNvbnN0cmFpbnQoKTsKLQkJCi0JCWVqYlByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlRWpiM1Byb2plY3QoIkVKQjMiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmdldFByb2plY3QoKSk7Ci0JCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdChlamJQcm9qZWN0KTsKLQkJd2ViUHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdChUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVXZWIyNVByb2plY3QoIldlYjI1IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKS5nZXRQcm9qZWN0KCkpOwotCQljcmVhdGVDb21waWxhdGlvblVuaXQod2ViUHJvamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaW5hbCBUZXN0UHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBwcm9qZWN0LmNyZWF0ZVBhY2thZ2UoQ1VfUEFDS0FHRSk7Ci0JCWZpbmFsIElUeXBlIGN1ID0gcHJvamVjdC5jcmVhdGVUeXBlKHBrZywgQ1VfTkFNRSArICIuamF2YSIsIENVX0NPTlRFTlQpOwotCQlyZWZyZXNoQW5kQnVpbGRQcm9qZWN0KHByb2plY3QpOwotCQlhc3NlcnRFcXVhbHMoIk5vIGVycm9ycyBleHBlY3RlZCIsIDAsIGN1LmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoRG9tVmFsaWRhdGlvbkNvbnN0YW50cy5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfT05FKS5sZW5ndGgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVmcmVzaEFuZEJ1aWxkUHJvamVjdChmaW5hbCBUZXN0UHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJcHJvamVjdC5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCQotCXByaXZhdGUgSVR5cGUgZmluZFRlc3RFbmRwb2ludChmaW5hbCBUZXN0UHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVAgPSBwcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7Ci0JCWZpbmFsIElUeXBlIHJlc3VsdCA9IGphdmFQLmZpbmRUeXBlKENVX1BBQ0tBR0UgKyAiLiIgKyBDVV9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIElXZWJTZXJ2aWNlIGZpbmRXZWJTZXJ2aWNlSW5Qcm9qZWN0KGZpbmFsIFRlc3RQcm9qZWN0IHByb2plY3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24gamVlNVJ1bnRpbWUgPSBuZXcgSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbigpOwotCQlqZWU1UnVudGltZS5jcmVhdGVET00obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCUlXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2ogPSBEb21VdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0QnlOYW1lKGplZTVSdW50aW1lLmdldERPTSgpLCBwcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQlmaW5hbCBFTGlzdDxJV2ViU2VydmljZT4gd2Vic2VydmljZXMgPSB3c1Byb2ouZ2V0V2ViU2VydmljZXMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiT25lIHdlYiBzZXJ2aWNlIGV4cGVjdGVkIiwgMSwgd2Vic2VydmljZXMuc2l6ZSgpKTsKLQkJcmV0dXJuIHdlYnNlcnZpY2VzLmdldCgwKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCB0ZXN0V3NBbm5vdGF0aW9uSW5FamJTdGF0ZWZ1bCgpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElUeXBlIGVuZHBvaW50VHlwZSA9IGZpbmRUZXN0RW5kcG9pbnQoZWpiUHJvamVjdCk7Ci0KLQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IHdzYW5uID0gKElBbm5vdGF0aW9uPElUeXBlPikgQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihXU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OLCBlbmRwb2ludFR5cGUsIG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKSk7Ci0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudCh3c2FubiwgZW5kcG9pbnRUeXBlKTsKLQkJcmVmcmVzaEFuZEJ1aWxkUHJvamVjdChlamJQcm9qZWN0KTsKLQkJSVN0YXR1cyB2YWxpZGF0aW9uU3RhdHVzID0gY29uc3RyYWludC5kb1ZhbGlkYXRlKGNyZWF0ZVZhbGlkYXRpb25Db25zdHJhaW50KGZpbmRXZWJTZXJ2aWNlSW5Qcm9qZWN0KGVqYlByb2plY3QpKSk7Ci0JCWFzc2VydEVxdWFscygiRXJyb3Igc3RhdHVzIGV4cGVjdGVkIiwgSVN0YXR1cy5FUlJPUiwgdmFsaWRhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHN0YXR1cyBtZXNzYWdlIiwgVmFsaWRhdGlvbk1lc3NhZ2VzLldzVmFsaWRhdGlvbl9Xc0Fubm90YXRpb25Pbk5vblNlc3Npb25CZWFuX0Vycm9yLCB2YWxpZGF0aW9uU3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0KLQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IGJlYW5Bbm5vdGF0aW9uID0gKElBbm5vdGF0aW9uPElUeXBlPikgQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiY29tLnN1bi54bWwuaW50ZXJuYWwud3MuZGV2ZWxvcGVyLlN0YXRlZnVsIiwgZW5kcG9pbnRUeXBlLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOwotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYmVhbkFubm90YXRpb24sIGVuZHBvaW50VHlwZSk7Ci0JCXJlZnJlc2hBbmRCdWlsZFByb2plY3QoZWpiUHJvamVjdCk7Ci0JCXZhbGlkYXRpb25TdGF0dXMgPSBjb25zdHJhaW50LmRvVmFsaWRhdGUoY3JlYXRlVmFsaWRhdGlvbkNvbnN0cmFpbnQoZmluZFdlYlNlcnZpY2VJblByb2plY3QoZWpiUHJvamVjdCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPSyBzdGF0dXMgZXhwZWN0ZWQiLCBJU3RhdHVzLk9LLCB2YWxpZGF0aW9uU3RhdHVzLmdldFNldmVyaXR5KCkpOwotCX0KLQotCXByaXZhdGUgSVZhbGlkYXRpb25Db250ZXh0IGNyZWF0ZVZhbGlkYXRpb25Db25zdHJhaW50KGZpbmFsIElXZWJTZXJ2aWNlIHdzKQotCXsKLQkJZmluYWwgTW9jazxJVmFsaWRhdGlvbkNvbnRleHQ+IGNvbnRleHQgPSBtb2NrKElWYWxpZGF0aW9uQ29udGV4dC5jbGFzcyk7Ci0JCWNvbnRleHQuc3R1YnMoKS5tZXRob2QoImdldFRhcmdldCIpLndpbGwocmV0dXJuVmFsdWUod3MpKTsKLQkJCi0JCXJldHVybiBjb250ZXh0LnByb3h5KCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgdGVzdFdzQW5ub3RhdGlvbkluV2ViKCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVR5cGUgZW5kcG9pbnRUeXBlID0gZmluZFRlc3RFbmRwb2ludCh3ZWJQcm9qZWN0KTsKLQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gd3Nhbm4gPSAoSUFubm90YXRpb248SVR5cGU+KSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIGVuZHBvaW50VHlwZSwgbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKTsKLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KHdzYW5uLCBlbmRwb2ludFR5cGUpOwotCQlyZWZyZXNoQW5kQnVpbGRQcm9qZWN0KHdlYlByb2plY3QpOwotCQlmaW5hbCBJU3RhdHVzIHZhbGlkYXRpb25TdGF0dXMgPSBjb25zdHJhaW50LmRvVmFsaWRhdGUoY3JlYXRlVmFsaWRhdGlvbkNvbnN0cmFpbnQoZmluZFdlYlNlcnZpY2VJblByb2plY3Qod2ViUHJvamVjdCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPSyBzdGF0dXMgZXhwZWN0ZWQiLCBJU3RhdHVzLk9LLCB2YWxpZGF0aW9uU3RhdHVzLmdldFNldmVyaXR5KCkpOwotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlzdXBlci50ZWFyRG93bigpOwotCQllamJQcm9qZWN0LmRpc3Bvc2UoKTsKLQkJd2ViUHJvamVjdC5kaXNwb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgTXlFbmRwb2ludFNlc3Npb25CZWFuQ29uc3RyYWludCBleHRlbmRzIEVuZHBvaW50SXNTZXNzaW9uQmVhbkNvbnN0cmFpbnQKLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjdHgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCXsKLQkJCXJldHVybiBzdXBlci5kb1ZhbGlkYXRlKGN0eCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9KYXhXc0RvbVZhbGlkYXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0pheFdzRG9tVmFsaWRhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmE5MmU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL0pheFdzRG9tVmFsaWRhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Eb21WYWxpZGF0b3JGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5JRG9tVmFsaWRhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5KYXhXc0RvbVZhbGlkYXRvcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIEpheFdzRG9tVmFsaWRhdG9yfQ0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF4V3NEb21WYWxpZGF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwcml2YXRlIEpheFdzRG9tVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsNCi0JCXZhbGlkYXRvciA9IG5ldyBKYXhXc0RvbVZhbGlkYXRvcigpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJlZCgpDQotCXsNCi0JCUNvbGxlY3Rpb248SURvbVZhbGlkYXRvcj4gdmFsaWRhdG9ycyA9IERvbVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UmVnaXN0ZXJlZFZhbGlkYXRvcnMoKTsNCi0JCUlEb21WYWxpZGF0b3IgdmFsaWRhdG9yPW51bGw7DQotCQlmb3IgKElEb21WYWxpZGF0b3IgZG9tVmFsaWRhdG9yIDogdmFsaWRhdG9ycykgew0KLQkJCWlmKGRvbVZhbGlkYXRvciBpbnN0YW5jZW9mIEpheFdzRG9tVmFsaWRhdG9yKSB7DQotCQkJCXZhbGlkYXRvciA9IGRvbVZhbGlkYXRvcjsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKCJKYXgtd3MgdmFsaWRhdG9yIG5vdCBmb3VuZCIsIHZhbGlkYXRvcik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdXBwb3J0ZWREb21SdW50aW1lKCkgew0KLQkJYXNzZXJ0RXF1YWxzKEplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24uSUQsIHZhbGlkYXRvci5nZXRTdXBwb3J0ZWREb21SdW50aW1lKCkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1NlaVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9TZWlWYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMjJhNDZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1NlaVZhbGlkYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLldzUHJvYmxlbXNSZXBvcnRlcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3IgU0VJIHZhbGlkYXRpb24gY29uc3RyYWludHMgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlWYWxpZGF0aW9uVGVzdCBleHRlbmRzIFZhbGlkYXRpb25UZXN0c1NldFVwIA0KLXsNCi0JcHJvdGVjdGVkIElUeXBlIHNlaVR5cGU7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzdXBlci5zZXRVcCgpOw0KLQkJc2VpVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2ssICJTZWkuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge30iKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZU5hbWVJc05DTmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsJCQ0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBmaW5kU2VpKCJ0ZXN0LlNlaSIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygwLCBtYXJrZXJzLmxlbmd0aCk7DQotCQkNCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIi0tLVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7fSIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQltYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7CQkNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoNDAsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDQ1LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoMiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUikpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldE5zSXNWYWxpZFVyaSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZmluZFNlaSgidGVzdC5TZWkiKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMCwgbWFya2Vycy5sZW5ndGgpOw0KLQkJDQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1cIl5eXlwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7fSIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQltYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDUxLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscyg1NiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVkdW5kYW5kQXR0cmlidXRlc09uRXhwbGljaXRTZWkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJOYW1lXCIsIHBvcnROYW1lPVwiUG9ydE5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge30iKTsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZmluZFNlaSgidGVzdC5TZWkiKTsJCQ0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoMTMsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDY4LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVkdW5kYW5kQXR0cmlidXRlc09uSW1wbGljaXRTZWkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrLCAiV3MuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIk5hbWVcIiwgcG9ydE5hbWU9XCJQb3J0TmFtZVwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsJCQ0KLQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBmaW5kU2VpKCJ0ZXN0LldzIik7DQotCQkNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMCwgbWFya2Vycy5sZW5ndGgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VpQ2xhc3NDb3JyZWN0RXhwbGljaXRTZWkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIGludGVyZmFjZSBTZWkge30iKTsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZmluZFNlaSgidGVzdC5TZWkiKTsJCQ0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoMTMsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDM0LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VpQ2xhc3NDb3JyZWN0SW1wbGljaXRTZWkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQl0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrLCAiV3MuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UgcHVibGljIGNsYXNzIFdzIHt9Iik7CQkNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gZmluZFNlaSgidGVzdC5XcyIpOw0KLQkJDQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcmtlcnMubGVuZ3RoKTsNCi0JfQ0KLX0NCi0JDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vVmFsaWRhdGlvblRlc3RzU2V0VXAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1ZhbGlkYXRpb25UZXN0c1NldFVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiYjZkY2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vVmFsaWRhdGlvblRlc3RzU2V0VXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy5kb20udmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5KYXhXc0RvbVZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5JV2FpdENvbmRpdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkFzc2VydGlvbnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucy5Db25kaXRpb25DaGVja0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLkZpbGVVdGlsczsNCi0NCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblRlc3RzU2V0VXAgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0JcHJvdGVjdGVkIFRlc3RQcm9qZWN0IHRlc3RQcm9qZWN0Ow0KLQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXQ7DQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IHRlc3RQYWNrOw0KLQlwcm90ZWN0ZWQgSmF4V3NEb21WYWxpZGF0b3IgdmFsaWRhdG9yOw0KLQlwcm90ZWN0ZWQgRG9tVXRpbCB1dGlsID0gRG9tVXRpbC5JTlNUQU5DRTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdGVzdFByb2plY3QgPSBuZXcgVGVzdFByb2plY3QoKTsNCi0JCXRlc3RQcm9qZWN0LmNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQl0ZXN0UGFjayA9IHRlc3RQcm9qZWN0LmNyZWF0ZVBhY2thZ2UoInRlc3QiKTsNCi0JCXZhbGlkYXRvciA9IG5ldyBKYXhXc0RvbVZhbGlkYXRvcigpOw0KLQkJDQotCQlJSmF2YU1vZGVsIGphdmFNb2RlbCA9IEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JCXRhcmdldCA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCkgDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZVByb2plY3QoSUphdmFQcm9qZWN0IHByaikgew0KLQkJCQlyZXR1cm4gcHJqLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHRlc3RQcm9qZWN0LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJfQ0KLQkJfTsNCi0JCXRhcmdldC5sb2FkKG51bGwpOw0KLQkJdGFyZ2V0LnN0YXJ0U3luY2hyb25pemluZygpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpDQotCXsNCi0JCXRyeSB7DQotCQkJdGVzdFByb2plY3QuZGlzcG9zZSgpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIF8pIHt9DQotCX0NCi0NCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIGZpbmRXcyhTdHJpbmcgd3NGUU5hbWUpDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSB1dGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlyZXR1cm4gdXRpbC5maW5kV3NCeUltcGxOYW1lKHdzUHJvamVjdCwgd3NGUU5hbWUpOwkJCQ0KLQl9DQotDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGZpbmRTZWkoU3RyaW5nIHNlaUZRTmFtZSkgDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSB1dGlsLmZpbmRQcm9qZWN0QnlOYW1lKHRhcmdldC5nZXRET00oKSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7DQotCQlyZXR1cm4gdXRpbC5maW5kU2VpQnlJbXBsTmFtZSh3c1Byb2plY3QsIHNlaUZRTmFtZSk7CQkNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udGVudHMoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSwgZmluYWwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlTdHJpbmcgbmV3Q29udGVudCA9ICJpbXBvcnQgIiArIHRlc3RQYWNrLmdldEVsZW1lbnROYW1lKCkgKyAiO1xuIiArIGNvbnRlbnRzOw0KLQkJRmlsZVV0aWxzLmdldEluc3RhbmNlKCkuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChjdSwgbmV3Q29udGVudCwgZmFsc2UsIG51bGwpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCB3YWl0VW50aWxNYXJrZXJzQXBwZWFyKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIG1hcmtlcklkLCBmaW5hbCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgZmluYWwgaW50IGRlcHRoKQ0KLQl7DQotCQlmaW5hbCBJV2FpdENvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgSVdhaXRDb25kaXRpb24oKXsNCi0JCQlwdWJsaWMgYm9vbGVhbiBjaGVja0NvbmRpdGlvbigpIHRocm93cyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJdHJ5DQotCQkJCXsNCi0JCQkJCXJldHVybiByZXNvdXJjZS5maW5kTWFya2VycyhtYXJrZXJJZCwgaW5jbHVkZVN1YnR5cGVzLCBkZXB0aCkubGVuZ3RoID4gMDsNCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQ0KLQkJCQl7DQotCQkJCQl0aHJvdyBuZXcgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24oZSk7DQotCQkJCX0NCi0JCQl9fTsNCi0JCUFzc2VydGlvbnMud2FpdEFzc2VydChjb25kaXRpb24sICJFcnJvciBtYXJrZXJzIGRpZCBub3QgZGlzYXBwZWFyIik7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHdhaXRVbnRpbE1hcmtlcnNEaXNhcHBlYXIoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgbWFya2VySWQsIGZpbmFsIGJvb2xlYW4gaW5jbHVkZVN1YnR5cGVzLCBmaW5hbCBpbnQgZGVwdGgpDQotCXsNCi0JCWZpbmFsIElXYWl0Q29uZGl0aW9uIGNvbmRpdGlvbiA9IG5ldyBJV2FpdENvbmRpdGlvbigpew0KLQkJCXB1YmxpYyBib29sZWFuIGNoZWNrQ29uZGl0aW9uKCkgdGhyb3dzIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uDQotCQkJew0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHJlc291cmNlLmZpbmRNYXJrZXJzKG1hcmtlcklkLCBpbmNsdWRlU3VidHlwZXMsIGRlcHRoKS5sZW5ndGggPT0gMDsNCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQ0KLQkJCQl7DQotCQkJCQl0aHJvdyBuZXcgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24oZSk7DQotCQkJCX0NCi0JCQl9fTsNCi0JCQlBc3NlcnRpb25zLndhaXRBc3NlcnQoY29uZGl0aW9uLCAiRXJyb3IgbWFya2VycyBkaWQgbm90IGFwcGVhciIpOw0KLQl9DQotCQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9XbVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9XbVZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5MGRhNjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvZG9tL3ZhbGlkYXRpb24vV21WYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLmRvbS52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5Xc1Byb2JsZW1zUmVwb3J0ZXI7DQotDQotcHVibGljIGNsYXNzIFdtVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBWYWxpZGF0aW9uVGVzdHNTZXRVcA0KLXsNCi0JcHJpdmF0ZSBJVHlwZSBzZWlUeXBlOw0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzdXBlci5zZXRVcCgpOw0KLQkJc2VpVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2ssICJTZWkuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge1xuIiArDQotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwidGVzdFwiKSBwdWJsaWMgdm9pZCB0ZXN0KCk7IiArDQotCQkJCSJ9Iik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lSXNOQ05hbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotLy8JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMCwgbWFya2Vycy5sZW5ndGgpOw0KLQkJDQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7XG4iICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCItLS1cIikgcHVibGljIHZvaWQgdGVzdCgpOyBcbiIgKyAifSIpOw0KLQkJDQotCQlzZWkgPSBmaW5kU2VpKCJ0ZXN0LlNlaSIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQl3YWl0VW50aWxNYXJrZXJzQXBwZWFyKHNlaVR5cGUuZ2V0UmVzb3VyY2UoKSwgV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCW1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoMTA5LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscygxMTQsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscygzLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZUlzVW5pcXVlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge1xuIiArDQotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwiT3BOYW1lXCIpIHB1YmxpYyB2b2lkIGZpcnN0KCk7IFxuIiArDQotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwiT3BOYW1lXCIpIHB1YmxpYyB2b2lkIHNlY29uZCgpOyBcbiIgKyANCi0JCQkJIn0iKTsNCi0JCQ0KLQkJc2VpID0gZmluZFNlaSgidGVzdC5TZWkiKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJd2FpdFVudGlsTWFya2Vyc0FwcGVhcihzZWlUeXBlLmdldFJlc291cmNlKCksIFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygyLCBtYXJrZXJzLmxlbmd0aCk7DQotCQkNCi0JCWFzc2VydFRydWUoKChJbnRlZ2VyKW1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpID4gMCk7DQotCQlhc3NlcnRUcnVlKCgoSW50ZWdlciltYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSkgPiAwKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7DQotCQlhc3NlcnRUcnVlKCgoSW50ZWdlciltYXJrZXJzWzFdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKSA+IDApOw0KLQkJYXNzZXJ0VHJ1ZSgoKEludGVnZXIpbWFya2Vyc1sxXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpID4gMCk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1sxXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOwkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lSXNVbmlxdWVFeGNsdWRlZE1ldGhvZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsJDQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHtcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QoZXhjbHVkZT10cnVlKSBwdWJsaWMgdm9pZCBmaXJzdCgpOyBcbiIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cImZpcnN0XCIpIHB1YmxpYyB2b2lkIHNlY29uZCgpOyBcbiIgKyANCi0JCQkJIn0iKTsNCi0JCQ0KLQkJc2VpID0gZmluZFNlaSgidGVzdC5TZWkiKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJd2FpdFVudGlsTWFya2Vyc0FwcGVhcihzZWlUeXBlLmdldFJlc291cmNlKCksIFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCS8vIG9ubHkgdGhlIG1hcmtlciBmb3IgaW5jb3JyZWN0ICdleGNsdWRlZD10cnVlJyBzaG91bGQgYmUgYXZhaWxhYmxlDQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDEwMywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoMTA3LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOw0KLQl9DQotDQotCS8qKiANCi0JICogdGhpcyB0ZXN0IGN1cnJlbnRseSBkb2VzIG5vdGhpbmcgYmVjYXVzZSBleGNsdWRlZCBtZXRob2RzIGFyZSBub3QgY29udGFpbmVkIGluIA0KLQkgKiB0aGUgbW9kZWwuIA0KLQkgKiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqLyANCi0JcHVibGljIHZvaWQgdGVzdFJlZHVuZGFudEF0dHJpYnV0ZXNGb3JFeGNsdWRlZE1ldGhvZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0vLwkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpTmFtZVwiKSBwdWJsaWMgY2xhc3MgU2VpIHtcbiIgKw0KLS8vCQkJCSJAamF2YXguandzLldlYk1ldGhvZChleGNsdWRlPXRydWUsIG9wZXJhdGlvbk5hbWU9XCJPcE5hbWVcIikgcHVibGljIHZvaWQgZmlyc3QoKTsgXG4iICsNCi0vLwkJCQkifSIpOw0KLS8vCQkNCi0vLwkJc2VpID0gZmluZFNlaSgidGVzdC5TZWkiKTsNCi0vLwkJSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3MoInRlc3QuU2VpIik7DQotLy8JCQ0KLS8vCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0vLwkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RDYW5ub3RCZUV4Y2x1ZGVkSW5TRUkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7CQkNCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge1xuIiArDQotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChleGNsdWRlPXRydWUpIHB1YmxpYyB2b2lkIGZpcnN0KCk7IFxuIiArDQotCQkJCSJ9Iik7DQotCQkNCi0JCXNlaSA9IGZpbmRTZWkoInRlc3QuU2VpIik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCXdhaXRVbnRpbE1hcmtlcnNBcHBlYXIoc2VpVHlwZS5nZXRSZXNvdXJjZSgpLCBXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDEwMywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoMTA3LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1dwVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1dwVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTMxZmM3YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9XcFZhbGlkYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLldzUHJvYmxlbXNSZXBvcnRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgV3BWYWxpZGF0aW9uVGVzdCBleHRlbmRzIFZhbGlkYXRpb25UZXN0c1NldFVwIA0KLXsNCi0JcHJvdGVjdGVkIElUeXBlIHNlaVR5cGU7DQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXN1cGVyLnNldFVwKCk7DQotCQlzZWlUeXBlID0gdGVzdFByb2plY3QuY3JlYXRlVHlwZSh0ZXN0UGFjaywgIlNlaS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7fSIpOw0KLQkJc2VpID0gZmluZFNlaShzZWlUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5hbWVJc05DTmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkgeyIgKw0KLQkJCQkicHVibGljIHZvaWQgdGVzdChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCItLS1cIilpbnQgYSk7IFxuIiArIA0KLQkJCQkifSIpOw0KLQkJDQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscygxMTUsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEyMCwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIpKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJ0TmFtZUlzTkNOYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgImltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZztcbiIgKw0KLQkJCQkiQFNPQVBCaW5kaW5nKHN0eWxlPVNPQVBCaW5kaW5nLlN0eWxlLlJQQykiICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7IiArDQotCQkJCSJwdWJsaWMgdm9pZCB0ZXN0KEBqYXZheC5qd3MuV2ViUGFyYW0ocGFydE5hbWU9XCItLS1cIilpbnQgYSk7IFxuIiArIA0KLQkJCQkifSIpOw0KLQkJDQotCQl2YWxpZGF0b3IudmFsaWRhdGUoc2VpKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHNlaVR5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscygxNzksIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDE4NCwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lSXNVbmlxZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkgeyIgKw0KLQkJCQkicHVibGljIHZvaWQgdGVzdChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJwYXJhbTFcIilpbnQgYSwgQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lPVwicGFyYW0xXCIpaW50IGIpOyBcbiIgKyANCi0JCQkJIn0iKTsNCi0JCQ0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygyLCBtYXJrZXJzLmxlbmd0aCk7DQotDQotCQlJTWFya2VyIGZpcnN0Ow0KLQkJSU1hcmtlciBzZWNvbmQ7DQotCQkNCi0JCWlmIChtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpLmVxdWFscyhuZXcgSW50ZWdlcigxMTUpKSApIHsNCi0JCQlmaXJzdCA9IG1hcmtlcnNbMF07DQotCQkJc2Vjb25kID0gbWFya2Vyc1sxXTsNCi0JCX0gZWxzZSB7DQotCQkJZmlyc3QgPSBtYXJrZXJzWzFdOw0KLQkJCXNlY29uZCA9IG1hcmtlcnNbMF07DQotCQl9DQotCQkNCi0JCWFzc2VydEVxdWFscygxMTUsIGZpcnN0LmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscygxMjMsIGZpcnN0LmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgZmlyc3QuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JCWFzc2VydEVxdWFscygxNTYsIHNlY29uZC5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoMTY0LCBzZWNvbmQuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBzZWNvbmQuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsJCQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5hbWVOb3RSZWR1bmRhbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQkvLyBpbiBSUEMgc3R5bGUgaWYgcGFydE5hbWUgaXMgbm90IHByZXNlbnQgdGhlIG5hbWUgaXMgbm90IHJlZHVuZGFudA0KLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgImltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZztcbiIgKw0KLQkJCQkiQFNPQVBCaW5kaW5nKHN0eWxlPVNPQVBCaW5kaW5nLlN0eWxlLlJQQykiICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7IiArDQotCQkJCSJwdWJsaWMgdm9pZCB0ZXN0KEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cIm15TmFtZVwiKWludCBhKTsgXG4iICsgDQotCQkJCSJ9Iik7DQotCQkNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMCwgbWFya2Vycy5sZW5ndGgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZVJlZHVuZGFudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCS8vIGluIFJQQyBzdHlsZSBpZiBwYXJ0TmFtZSBpcyBwcmVzZW50IHRoZSBuYW1lIGlzIHJlZHVuZGFudA0KLQkJc2V0Q29udGVudHMoc2VpVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgImltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZztcbiIgKw0KLQkJCQkiQFNPQVBCaW5kaW5nKHN0eWxlPVNPQVBCaW5kaW5nLlN0eWxlLlJQQykiICsNCi0JCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7IiArDQotCQkJCSJwdWJsaWMgdm9pZCB0ZXN0KEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cIm15TmFtZVwiLCBwYXJ0TmFtZT1cIm15UGFydFwiKWludCBhKTsgXG4iICsgDQotCQkJCSJ9Iik7DQotCQkNCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDE3NSwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoMTgzLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lSXNSZXF1aXJlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXNldENvbnRlbnRzKHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJpbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7XG4iICsNCi0JCQkJIkBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZT1TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKSIgKw0KLQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHsiICsNCi0JCQkJInB1YmxpYyBpbnQgdGVzdChAamF2YXguandzLldlYlBhcmFtKG1vZGU9V2ViUGFyYW0uTW9kZS5JTk9VVCkgaW50IGEpOyBcbiIgKyANCi0JCQkJIn0iKTsNCi0NCi0JCXZhbGlkYXRvci52YWxpZGF0ZShzZWkpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gc2VpVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDE2OCwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoMjEzLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldE5zVmFsaWRVcmkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlzZXRDb250ZW50cyhzZWlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWlOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpIHsiICsNCi0JCQkJInB1YmxpYyB2b2lkIHRlc3QoQGphdmF4Lmp3cy5XZWJQYXJhbSh0YXJnZXROYW1lc3BhY2U9XCJeXl5cIilpbnQgYSk7IFxuIiArIA0KLQkJCQkifSIpOw0KLQ0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHNlaSk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoMTI2LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscygxMzEsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7CQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1dzVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL2RvbS92YWxpZGF0aW9uL1dzVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDk5ZmVkNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy9kb20vdmFsaWRhdGlvbi9Xc1ZhbGlkYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMuZG9tLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24uV3NQcm9ibGVtc1JlcG9ydGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLlN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgV3NWYWxpZGF0aW9uVGVzdCBleHRlbmRzIFZhbGlkYXRpb25UZXN0c1NldFVwIA0KLXsNCi0JcHJpdmF0ZSBJVHlwZSB3c1R5cGU7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXN1cGVyLnNldFVwKCk7DQotCQl3c1R5cGUgPSB0ZXN0UHJvamVjdC5jcmVhdGVUeXBlKHRlc3RQYWNrLCAiV3MuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXc05hbWVcIikgcHVibGljIGNsYXNzIFdzIHt9Iik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlTmFtZUlzTkNOYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3MoInRlc3QuV3MiKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCQ0KLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiLS0tXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHdzKTsNCi0JCQ0KLQkJbWFya2VycyA9IHdzVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKDQ3LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQpKTsNCi0JCWFzc2VydEVxdWFscyg1MiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIpKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UG9ydE5hbWVJc05DTmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJ0ZXN0LldzIik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygwLCBtYXJrZXJzLmxlbmd0aCk7DQotCQkNCi0JCXNldENvbnRlbnRzKHdzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShwb3J0TmFtZT1cIi0tLVwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotCQkNCi0JCW1hcmtlcnMgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscyg0NCwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoNDksIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7CQkNCi0JfQkJDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0TnNJc1VyaSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IGZpbmRXcygidGVzdC5XcyIpOw0KLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1cIl5eXlwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotDQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscyg1MSwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoNTYsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7CQkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U0VJRXhpc3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJ0ZXN0LldzIik7DQotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJjb20uc2FwLmRlbW8uVGVzdFwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotDQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscyg1MywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoNzIsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7CQkJDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdE5hbWVNaXNzaW5nSWZTZWlSZWZlcmVuY2VkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCXsNCi0JCWZpbmFsIElUeXBlIHNlaSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2ssICJTZWkuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkge30iKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpKTsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJ0ZXN0LldzIik7DQotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJ0ZXN0LlNlaVwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwkJDQotCQlhc3NlcnRFcXVhbHMoMCwgbWFya2Vycy5sZW5ndGgpOw0KLQkJDQotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlRlc3RcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJ0ZXN0LlNlaVwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotCQltYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoNDAsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDQ2LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOwkJDQotCX0JDQotDQotCXB1YmxpYyB2b2lkIHRlc3RXc2RsTG9jYXRpb25JblByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IGZpbmRXcygidGVzdC5XcyIpOw0KLQkJSUZpbGUgZmlsZSA9IHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKCJUZXN0LndzZGwiKTsNCi0JCWZpbGUuY3JlYXRlKG5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIoIiIpLCB0cnVlLCBudWxsKTsNCi0JCQ0KLQkJc2V0Q29udGVudHMod3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJUZXN0XCIsIHdzZGxMb2NhdGlvbj1cIlRlc3Qud3NkbFwiKSBwdWJsaWMgY2xhc3MgV3Mge30iKTsNCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotCQlJTWFya2VyIFtdIG1hcmtlcnMgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcmtlcnMubGVuZ3RoKTsJCQ0KLQkJLy8gd3JvbmcgbG9jYXRpb24NCi0JCXNldENvbnRlbnRzKHdzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiVGVzdFwiLCB3c2RsTG9jYXRpb249XCJUZXN0MS53c2RsXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHdzKTsNCi0JCW1hcmtlcnMgPSB3c1R5cGUuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhXc1Byb2JsZW1zUmVwb3J0ZXIuTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOw0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcmtlcnMubGVuZ3RoKTsNCi0JCWFzc2VydEVxdWFscyg2MSwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoNzMsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscyhJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RXc2RsTG9jYXRpb25Jbk1ldGFJbmZDb3JyZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3MoInRlc3QuV3MiKTsNCi0JCWZpbmFsIElGb2xkZXIgbWV0YUluZiA9ICgoSUZvbGRlcil0ZXN0UHJvamVjdC5nZXRTb3VyY2VGb2xkZXIoKS5nZXRSZXNvdXJjZSgpKS5nZXRGb2xkZXIoIk1FVEEtSU5GIik7DQotCQltZXRhSW5mLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsNCi0JCUlGaWxlIGZpbGUgPSBtZXRhSW5mLmdldEZpbGUoIlRlc3Qud3NkbCIpOw0KLQkJZmlsZS5jcmVhdGUobmV3IFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcigiIiksIHRydWUsIG51bGwpOw0KLQkJDQotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlRlc3RcIiwgd3NkbExvY2F0aW9uPVwiTUVUQS1JTkYvVGVzdC53c2RsXCIpIHB1YmxpYyBjbGFzcyBXcyB7fSIpOw0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHdzKTsNCi0JCUlNYXJrZXIgW10gbWFya2VycyA9IHdzVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMCwgbWFya2Vycy5sZW5ndGgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0V3NkbExvY2F0aW9uSW5jb3JyZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3MoInRlc3QuV3MiKTsJCQ0KLQkJLy8gZW1wdHkgbG9jYXRpb24NCi0JCXNldENvbnRlbnRzKHdzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiVGVzdFwiLCB3c2RsTG9jYXRpb249XCJcIikgcHVibGljIGNsYXNzIFdzIHt9Iik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoNjEsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDYzLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSk7CQkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RFbmRwb2ludENvcnJlY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UgY2xhc3MgV3Mge30iKTsNCi0JCUlXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJ0ZXN0LldzIik7DQotCQl2YWxpZGF0b3IudmFsaWRhdGUod3MpOw0KLQkJSU1hcmtlciBbXSBtYXJrZXJzID0gd3NUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7DQotCQlhc3NlcnRFcXVhbHMoMTMsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDM0LCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7DQotCQlhc3NlcnRFcXVhbHMoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpOwkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEVuZHBvaW50SW1wbGVtZW50c1NlaSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQl7DQotCQlJVHlwZSBzZWlUeXBlID0gdGVzdFByb2plY3QuY3JlYXRlVHlwZSh0ZXN0UGFjaywgIlNlaS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZSBwdWJsaWMgaW50ZXJmYWNlIFNlaSB7IiArIA0KLQkJCQkicHVibGljIHZvaWQgdGVzdCgpOyIgKyANCi0JCQkJInB1YmxpYyBpbnQgc2Vjb25kKGludCBhLCBpbnQgYiwgU3RyaW5nIGMpOyIgKyANCi0JCQkJIn0iKTsgDQotCQlzZXRDb250ZW50cyh3c1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksICJAamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2U9XCJ0ZXN0LlNlaVwiKSBwdWJsaWMgY2xhc3MgV3MgeyIgKyANCi0JCQkJInB1YmxpYyB2b2lkIHRlc3QoKSB7fSIgKyANCi0JCQkifSIpOw0KLQkJDQotCQlJV2ViU2VydmljZSB3cyA9IGZpbmRXcygidGVzdC5XcyIpOyANCi0NCi0JCXZhbGlkYXRvci52YWxpZGF0ZSh3cyk7DQotCQlJTWFya2VyW10gbWFya2VycyA9IHdzVHlwZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKFdzUHJvYmxlbXNSZXBvcnRlci5NQVJLRVJfSUQsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7DQotCQlhc3NlcnRFcXVhbHMoMSwgbWFya2Vycy5sZW5ndGgpOw0KLQkJYXNzZXJ0RXF1YWxzKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpKTsNCi0JCWFzc2VydEVxdWFscyg1MywgbWFya2Vyc1swXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSk7DQotCQlhc3NlcnRFcXVhbHMoNjMsIG1hcmtlcnNbMF0uZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQpKTsNCi0JCWFzc2VydEVxdWFscygyLCBtYXJrZXJzWzBdLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSKSk7DQotCQkNCi0JCW1hcmtlcnMgPSBzZWlUeXBlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoV3NQcm9ibGVtc1JlcG9ydGVyLk1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsNCi0JCWFzc2VydEVxdWFscygwLCBtYXJrZXJzLmxlbmd0aCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9NZXRob2RWYWxpZGF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL01ldGhvZFZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTg1ZDFiZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL01ldGhvZFZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5NZXRob2RWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkNvbnN0cnVjdG9yTm90RXhwb3NhYmxlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkhhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5Jbmhlcml0YW5jZUFuZEltcGxlbWVudGF0aW9uRXhlY3B0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkludGVyZmFjZXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuTWV0aG9kTm90UHVibGljRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLk5vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLlJlbW90ZU9iamVjdEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotDQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpDQotcHVibGljIGNsYXNzIE1ldGhvZFZhbGlkYXRvclRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAicnVudGltZS50eXBlLnZhbGlkYXRpb24udGVzdCI7DQotDQotCXByaXZhdGUgTWV0aG9kVmFsaWRhdG9yIHZhbGlkYXRvcjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotDQotCQljcmVhdGVDbGFzc2VzKCJtb2NrL1J1bnRpbWVDbGFzc2VzLnNyYyIpOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygibW9jay9FbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0NCi0JCXZhbGlkYXRvciA9IG5ldyBNZXRob2RWYWxpZGF0b3IoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tHZW5lcmFsQ2FzZXMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZ1tdIGVtcHR5UGFyYW1zID0gbmV3IFN0cmluZ1tdIHt9Ow0KLQ0KLQkJLy8gY2hlY2sgY29uc3RydWN0b3INCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJFbmRwb2ludCIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvck5vdEV4cG9zYWJsZUV4Y2VwdGlvbik7DQotDQotCQkvLyBjaGVjayBwcml2YXRlIG1ldGhvZA0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJwcml2YXRlTWV0aG9kIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0Tm90TnVsbChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgTWV0aG9kTm90UHVibGljRXhjZXB0aW9uKTsNCi0NCi0JCS8vIGNoZWNrIHByb3RlY3RlZA0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJwcm90ZWN0ZWRNZXRob2QiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBNZXRob2ROb3RQdWJsaWNFeGNlcHRpb24pOw0KLQ0KLQkJLy8gY2hlY2sgdXNlIHVuc3VwcG9ydGVkIGphdmF4LiogY2xhc3MgZm9yIHJldHVybiB0eXBlDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZVVuc3VwcG9ydGVkSmF2YVR5cGUiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbik7DQotDQotCQkvLyBjaGVjayB1c2UgdW5zdXBwb3J0ZWQgamF2YXguKiBjbGFzcyBmb3IgcmV0dXJuIHR5cGUNCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlU3VwcG9ydGVkSmF2YVR5cGUiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotDQotCQkvLyBjaGVjayB1c2Ugdm9pZCByZXR1cm4gdHlwZQ0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VWb2lkIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0TWVzc2FnZSgpLmVxdWFscygiIikpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQ0KLQkJLy8gY2hlY2sgdXNlIGFycmF5IGFzIHJldHVybiB0eXBlDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZUFycmF5QXNSZXR1cm5WYWx1ZSIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0NCi0JCS8vIGNoZWNrIHVzZSBhcnJheSBhcyBwYXJhbWV0aGVyDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZUFycmF5QXNQYXJhbSIsIG5ldyBTdHJpbmdbXSB7ICJbSSIgfSk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotDQotCQkvLyBjaGVjayB1c2UgbXVsdHkgZGltZW50aW9uIGFycmF5IGFzIHBhcmFtZXRoZXINCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlTURBcnJheUFzUGFyYW0iLCBuZXcgU3RyaW5nW10geyAiW1tbSSIgfSk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotDQotCQkvLyBjaGVjayB1c2UgbmVzdGVkIGdlbmVyaWNzDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZU5lc3RlZEdlbmVyaWNzIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOw0KLQkJYXNzZXJ0Tm90TnVsbChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0NCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlRXh0ZW5kc0luR2VuZXJpY3MiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQ0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VTdXBlckluR2VuZXJpY3MiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQ0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VTdXBlckluR2VuZXJpY3NBc1BhcmFtIiwgbmV3IFN0cmluZ1tdIHsgIlFMaXN0PC1RU3RyaW5nOz47IiB9KTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotDQotCQkvLyBjaGVjayBtZXRob2QgcmV0dXJuaW5nIGVudW0NCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlRW51bSIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotDQotCQkvLyBjaGVjayBtZXRob2QgcmV0dXJuaW5nIGN1c3RvbSBtYXANCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlTXlNYXAiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDZWNrVHlwZXNJbmNvbXBhdGlibGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZ1tdIGVtcHR5UGFyYW1zID0gbmV3IFN0cmluZ1tdIHt9Ow0KLQ0KLQkJLy8gdXNlIHR5cGUgd2hpY2ggZG9lc24ndCBoYXZlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VJbXBsZW1lbnRzUmVtb3RlIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBSZW1vdGVPYmplY3RFeGNlcHRpb24pOw0KLQ0KLQkJLy8gdXNlIHR5cGUgd2hpY2ggZG9lc24ndCBoYXZlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlTm9EZWZhdWx0Q29uc3RydWN0b3IiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbik7DQotDQotCQkvLyB1c2UgdHlwZSB3aGljaCBoYXMgbm9uIHB1YmxpYyBub24gc3RhdGljIGlubmVyIGNsYXNzDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZUhhc0luYWRtaXNhYmxlSW5uZXJDbGFzcyIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKTsNCi0JCWFzc2VydE5vdE51bGwoc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEhhc0luYWRtaXNhYmxlSW5uZXJUeXBlc0V4Y2VwdGlvbik7DQotDQotCQkvLyB1c2UgdHlwZSBhcyBwYXJhbWV0aGVyIHdoaWNoIGNvbnRhaW5zIHVuc3VwcG9ydGVkIGphdmEgdHlwZSBhcyBwdWJsaWMgZmllbGQNCi0JCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbXSB7ICJRVXNlc1Vuc3VwcG9ydGVkQXNGaWVsZDsiIH07DQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZVVzZXNVbnN1cHBvcnRlZEFzRmllbGQiLCBwYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0Tm90TnVsbChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24pOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDZWNrVHlwZXNJbmNvbXBhdGlibGVJbXBsZW1lbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nW10gZW1wdHlQYXJhbXMgPSBuZXcgU3RyaW5nW10ge307DQotDQotCQkvLyB1c2Ugbm90IGltcGxlbWVudGVkIGFic3RyYWN0IGNsYXNzDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlTm90SW1wbGVtZW50ZWRBYnN0cmFjdENsYXNzIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnROb3ROdWxsKHN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBBYnN0cmFjdENsYXNzTm90SW1wbGVtZW50ZWRFeGNlcHRpb24pOw0KLQ0KLQkJLy8gdXNlIGltcGxlbWVudGVkIGFic3RyYWN0IGNsYXNzDQotCQltZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZUltcGxlbWVudGVkQWJzdHJhY3RDbGFzcyIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tJbnRlcmZhY2VzVXNlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nW10gZW1wdHlQYXJhbXMgPSBuZXcgU3RyaW5nW10ge307DQotDQotCQkvLyB1c2Ugbm90IGltcGxlbWVudGVkIGludGVyZmFjZQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoInVzZUludGVyZmFjZSIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0Tm90TnVsbChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgSW50ZXJmYWNlc05vdFN1cHBvcnRlZEV4Y2VwdGlvbik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENlY2tUeXBlc0luY29tcGF0aWJsZUluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmdbXSBlbXB0eVBhcmFtcyA9IG5ldyBTdHJpbmdbXSB7fTsNCi0NCi0JCS8vIHVzZSBjbGFzcyB0aGF0IGV4dGVuZHMgY3VzdG9tIGNsYXNzIGFuZCBjdXN0b20gaW50ZXJmYWNlDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlTXVsdHlJbmhlcml0YW5jZVVzZUNsYXNzIiwgbmV3IFN0cmluZ1tdIHsgIlFNdWx0eUluaGVyaXRhbmNlVXNlQ2xhc3M7IiB9KTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0Tm90TnVsbChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgSW5oZXJpdGFuY2VBbmRJbXBsZW1lbnRhdGlvbkV4ZWNwdGlvbik7DQotDQotCQkvLyB1c2UgY2xhc3MgdGhhdCBleHRlbmRzIGNsYXNzIGFuZCBpbXBsZW1lbnRzIDMgc3VwcG9ydGVkIGludGVyZmFjZXMNCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhCYXNlQ2xhc3MiLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IuY2hlY2sobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSyk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSk7DQotCQlhc3NlcnROdWxsKHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7DQotDQotCQkvLyBTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEludGVyZmFjZQ0KLQkJbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEludGVyZmFjZSIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0NCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlSW1wbGVtZW50ZWRCYXNlSW5HZW5lcmljcyIsIGVtcHR5UGFyYW1zKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2Vja01ldGhvZHNXaXRoRXhjZXB0aW9ucygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nW10gZW1wdHlQYXJhbXMgPSBuZXcgU3RyaW5nW10ge307DQotDQotCQkvLyB1c2UgY2xhc3MgdGhhdCBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24gYW5kIGN1c3RvbSBpbnRlcmZhY2UNCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJ1c2VDdXN0b21FeGNlcHRpb24iLCBlbXB0eVBhcmFtcyk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci5jaGVjayhtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsNCi0JCWFzc2VydFRydWUoc3RhdHVzLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKTsNCi0JCWFzc2VydE51bGwoc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsNCi0NCi0JCW1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgidXNlRXhjZXB0aW9uIiwgZW1wdHlQYXJhbXMpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOw0KLQkJc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOw0KLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0TWVzc2FnZSgpLmVxdWFscygiIikpOw0KLQkJYXNzZXJ0TnVsbChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDaGVja01ldGhvZFdpdGhEZWZhdWx0QWNjZXNzSW5JbnRlcmZhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyBzZWlDb2RlID0gInB1YmxpYyBpbnRlcmZhY2UgU0VJV2l0aERlZmF1bHRBY2Nlc3NNZXRob2QgeyBcbiIgKw0KLQkJCQkiCVN0cmluZyB0ZXN0KCk7IFxuIiArDQotCQkJCSJ9IjsNCi0JCWZpbmFsIElUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmNyZWF0ZVR5cGUoZGVmYXVsdFBhY2thZ2UsICJTRUlXaXRoRGVmYXVsdEFjY2Vzc01ldGhvZC5qYXZhIiwgc2VpQ29kZSk7DQotCQlmaW5hbCBJTWV0aG9kIG1ldGhvZCA9IHNlaVR5cGUuZ2V0TWV0aG9kKCJ0ZXN0IiwgbmV3IFN0cmluZyBbXXt9KTsNCi0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmNoZWNrKG1ldGhvZCk7DQotCQlhc3NlcnRFcXVhbHMoIkRlZmF1bHQgbWV0aG9kIGluIFNFSSByZXBvcnRlZCBhcyBpbmNvcnJlY3QiLCBJU3RhdHVzLk9LLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9SdW50aW1lVHlwZVZhbGlkYXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vUnVudGltZVR5cGVWYWxpZGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyM2Q5ZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9SdW50aW1lVHlwZVZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC52YWxpZGF0aW9uLnByb3ZpZGVyLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLlJ1bnRpbWVUeXBlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuQWJzdHJhY3RDbGFzc05vdEltcGxlbWVudGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuSGFzSW5hZG1pc2FibGVJbm5lclR5cGVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLkluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnZhbGlkYXRpb24ucHJvdmlkZXIuZXhjZXB0aW9ucy5JbnRlcmZhY2VzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuTXVsdGlwbGVJbXBsZW1lbnRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5leGNlcHRpb25zLk5vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS52YWxpZGF0aW9uLnByb3ZpZGVyLmV4Y2VwdGlvbnMuUmVtb3RlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0OwotCi0vKioKLSAqIFRlc3QgZm9yIHJ1bnRpbWUgdHlwZXMgdmFsaWRhdGlvbi4KLSAqCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJ1bnRpbWVUeXBlVmFsaWRhdG9yVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QKLXsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1JDID0gInNyYyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUENLID0gInJ1bnRpbWUudHlwZS52YWxpZGF0aW9uLnRlc3QiOwotCi0JcHJpdmF0ZSBSdW50aW1lVHlwZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQKLQl7Ci0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsKLQotCQljcmVhdGVDbGFzc2VzKCJtb2NrL1J1bnRpbWVDbGFzc2VzLnNyYyIpOwotCQl2YWxpZGF0b3IgPSBuZXcgUnVudGltZVR5cGVWYWxpZGF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVHZW5lcmFsQ2FzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkCi0JewotCQkvLyBjaGVjayB1bnN1cHBvcnRlZCBqYXZheC4qIGNsYXNzCi0JCUlUeXBlIHR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgImphdmEuc3FsLkRhdGUiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdHJ5Ci0JCXsKLQkJCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsKLQkJCWZhaWwoIk5vdFN1cHBvcnRlZEphdmFUeXBlIik7Ci0JCX0gY2F0Y2ggKE5vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uIGUpCi0JCXsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQotCQkvLyBjaGVjayBzdXBwb3J0ZWQgamF2YSB0eXBlCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgImphdmEubmV0LlVSSSIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7Ci0KLQkJLy8gY2hlY2sgdW5zdXBwb3J0ZWQgamF2YXguKiBjbGFzcyB1c2VkIGluIGdldHRlcgotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuVXNlc1Vuc3VwcG9ydGVkQXNQcm9wZXJ0eSIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl0cnkKLQkJewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQkJZmFpbCgiVXNlc1Vuc3VwcG9ydGVkQXNQcm9wZXJ0eSIpOwotCQl9IGNhdGNoIChOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0KLQkJLy8gdXNlcyB1bnN1cHBvcnRlZCBpbiBub3QgYSBnZXR0ZXIgbWV0aG9kCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5Vc2VzVW5zdXBwb3J0ZWRJbk1ldGhvZCIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVNxbFR5bWVzdGFtcE5vdFN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCUlUeXBlIHR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgImphdmEuc3FsLlRpbWVzdGFtcCIpOwotCQl0cnkgewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQkJZmFpbCgiamF2YS5zcWwuVGltZXN0YW1wIG5vdCBkZXRlY3RlZCBhcyB1bnN1cHBvcnRlZCIpOwotCQl9IGNhdGNoIChOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBfKSB7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVOb0RlZmF1bHRDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQKLQl7Ci0JCS8vIHVzZSB0eXBlIHdoaWNoIGRvZXNuJ3QgaGF2ZSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JCUlUeXBlIHR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5Ob0RlZmF1bHRDb25zdHJ1Y3RvciIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl0cnkKLQkJewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQkJZmFpbCgiTm9EZWZhdWx0Q29uc3RydWN0b3IiKTsKLQkJfSBjYXRjaCAoTm9EZWZhdWx0Q29uc3RydWN0b3JFeGNlcHRpb24gZSkKLQkJewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5Ob0RlZmF1bHRDb25zdHJ1Y3RvclByaXZhdGVDb25zdHJ1Y3RvcnMiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdHJ5Ci0JCXsKLQkJCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsKLQkJCWZhaWwoIk5vRGVmYXVsdENvbnN0cnVjdG9yUHJpdmF0ZUNvbnN0cnVjdG9ycyIpOwotCQl9IGNhdGNoIChOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVzZXNVbnN1cHBvcnRlZEluVHJhbnNpZW50TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJLy8gdXNlcyB1bnN1cHBvcnRlZCBpbiB4bWwgdHJhbnNpZW50IG1ldGhvZAotCQlJVHlwZSB0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuVXNlc1Vuc3VwcG9ydGVkSW5UcmFuc2llbnRNZXRob2QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RYbWxUeXBlQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLlhtbFR5cGVDbGFzcyIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl0cnkKLQkJewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQl9IGNhdGNoIChOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlmYWlsKCJYTUwgVHlwZSBhbm5vdGF0ZWQgY2xhc3Mgbm90IHJlY29nbml6ZWQiKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXZWJGYXVsdEFubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCUlUeXBlIHR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5XZWJGYXVsdENsYXNzIik7Ci0JCWFzc2VydE5vdE51bGwodHlwZSk7Ci0JCXRyeQotCQl7Ci0JCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7Ci0JCX0gY2F0Y2ggKE5vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uIGUpCi0JCXsKLQkJCWZhaWwoIldlYiBGYXVsdCBhbm5vdGF0ZWQgY2xhc3Mgbm90IHJlY29nbml6ZWQiKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUN1c3RvbUNvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkCi0JewotCQlJVHlwZSB0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuTXlTZXQiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUN1c3RvbU1hcCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQKLQl7Ci0JCUlUeXBlIHR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5NeU1hcCIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlVHlwZXNJbmNvbXBhdGlibGUoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkCi0JewotCQkvLyB1c2UgdHlwZSB3aGljaCBkb2Vzbid0IGhhdmUgZGVmYXVsdCBjb25zdHJ1Y3RvcgotCQlJVHlwZSB0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuSW1wbGVtZW50c1JlbW90ZSIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl0cnkKLQkJewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQkJZmFpbCgiSW1wbGVtZW50c1JlbW90ZSIpOwotCQl9IGNhdGNoIChSZW1vdGVPYmplY3RFeGNlcHRpb24gZSkKLQkJewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCi0JCS8vIHVzZSB0eXBlIHdoaWNoIGhhcyBub24gcHVibGljIG5vbiBzdGF0aWMgaW5uZXIgY2xhc3MKLQkJdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkhhc0luYWRtaXNhYmxlSW5uZXJDbGFzcyIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl0cnkKLQkJewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQkJZmFpbCgiSW1wbGVtZW50c1JlbW90ZSIpOwotCQl9IGNhdGNoIChIYXNJbmFkbWlzYWJsZUlubmVyVHlwZXNFeGNlcHRpb24gZSkKLQkJewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCi0JCS8vIHVzZSB0eXBlIGFzIHBhcmFtZXRoZXIgd2hpY2ggY29udGFpbnMgdW5zdXBwb3J0ZWQgamF2YSB0eXBlIGFzIHB1YmxpYyBmaWVsZAotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuVXNlc1Vuc3VwcG9ydGVkQXNGaWVsZCIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl0cnkKLQkJewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQkJZmFpbCgiSW1wbGVtZW50c1JlbW90ZSIpOwotCQl9IGNhdGNoIChOb0RlZmF1bHRDb25zdHJ1Y3RvckV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlVHlwZXNJbmNvbXBhdGlibGVJbXBsZW1lbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCS8vIHVzZSBub3QgaW1wbGVtZW50ZWQgYWJzdHJhY3QgY2xhc3MKLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkJhc2VOb3RJbXBsZW1lbnRlZCIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl0cnkKLQkJewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQkJZmFpbCgiSW1wbGVtZW50c1JlbW90ZSIpOwotCQl9IGNhdGNoIChBYnN0cmFjdENsYXNzTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gZSkKLQkJewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCi0JCS8vIHVzZSBpbXBsZW1lbnRlZCBhYnN0cmFjdCBjbGFzcwotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuQmFzZUltcGxlbWVudGVkIik7Ci0JCWFzc2VydE5vdE51bGwodHlwZSk7Ci0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsKLQotCQkvLyB1c2UgaW50ZXJmYWNlCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5JbnRlcmZhY2VJbXBsZW1lbnRlZCIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl0cnkKLQkJewotCQkJLy8gdXNlIGltcGxlbWVudGVkIGludGVyZmFjZQotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQl9IGNhdGNoIChJbnRlcmZhY2VzTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0JCXsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVUeXBlc0luY29tcGF0aWJsZUluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJLy8gdXNlIGNsYXNzIHRoYXQgZXh0ZW5kcyBjdXN0b20gY2xhc3MgYW5kIGN1c3RvbSBpbnRlcmZhY2UKLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLk11bHR5SW5oZXJpdGFuY2VVc2VDbGFzcyIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl0cnkKLQkJewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQkJZmFpbCgiTXVsdHlJbmhlcml0YW5jZVVzZUNsYXNzIik7Ci0JCX0gY2F0Y2ggKEluaGVyaXRhbmNlQW5kSW1wbGVtZW50YXRpb25FeGVjcHRpb24gZSkKLQkJewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCi0JCS8vIHVzZSBtdWx0eSBpbmhlcml0YW5jZSB3aXRoIDIgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcwotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuTXVsdHlJbmhlcml0YW5jZVVzZUludGVyZmFjZXMiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdHJ5Ci0JCXsKLQkJCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsKLQkJCWZhaWwoIk11bHR5SW5oZXJpdGFuY2VVc2VJbnRlcmZhY2VzIik7Ci0JCX0gY2F0Y2ggKE11bHRpcGxlSW1wbGVtZW50YXRpb25FeGNlcHRpb24gZSkKLQkJewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCi0JCS8vIHVzZSBjbGFzcyB0aGF0IGV4dGVuZHMgY2xhc3MgYW5kIGltcGxlbWVudHMgMyBzdXBwb3J0ZWQgaW50ZXJmYWNlcwotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhCYXNlQ2xhc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCi0JCS8vIFN1cHBvcnRlZE11bHR5SW5oZXJpdGFuY2VXaXRoSW50ZXJmYWNlCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5TdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEludGVyZmFjZSIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7Ci0KLQkJdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkJhc2VJbXBsZW1lbnRlZE5vdENvcnJlY3RseSIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl0cnkKLQkJewotCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCQkJZmFpbCgiTXVsdHlJbmhlcml0YW5jZVVzZUNsYXNzIik7Ci0JCX0gY2F0Y2ggKEFic3RyYWN0Q2xhc3NOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlVHlwZXNVc2luZ0dlbmVyaWNzKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJLy8gY2hlY2sgc3VwcG9ydGVkIHR5cGUgaW4gbGlzdCB1c2luZyBnZW5lcmljcwotCQlJVHlwZSB0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuQ29udGFpbnNMaXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodHlwZSk7Ci0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsKLQotCQkvLyBjaGVjayBub3Qgc3VwcG9ydGVkIHR5cGUgaW4gbGlzdCB1c2luZyBnZW5lcmljcwotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuQ29udGFpbnNOb3RTdXBwb3J0ZWRJbkxpc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdHJ5Ci0JCXsKLQkJCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsKLQkJCWZhaWwoIkNvbnRhaW5zTm90U3VwcG9ydGVkSW5MaXN0Iik7Ci0JCX0gY2F0Y2ggKE5vRGVmYXVsdENvbnN0cnVjdG9yRXhjZXB0aW9uIGUpCi0JCXsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQotCQkvLyBjaGVjayBzdXBwb3J0ZWQgdHlwZSBpbiBsaXN0IHVzaW5nIHF1b3RlCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5Db250YWluc1F1b3RlSW5MaXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodHlwZSk7Ci0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsKLQotCQkvLyBjaGVjayBzdXBwb3J0ZWQgdHlwZSBpbiBsaXN0IHVzaW5nIHF1b3RlCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5Db250YWluc0V4dGVuZHNJbkxpc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCi0JCXR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5Db250YWluc1N1cGVySW5MaXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodHlwZSk7Ci0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVUeXBlc0NpcmN1bGFyUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJLy8gY2hlY2sgY2lyY3VsYXIgcmVmZXJlbmNlIHZpYSBtZW1iZXIgdmFyaWJsZXMKLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkNpcmN1bGFyQXNQYXJhbUEiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCi0JCS8vIGNoZWNrIGNpcmN1bGFyIHJlZmVyZW5jZSB2aWEgcmV0dXJuIHZhbHVlcwotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuQ2lyY3VsYXJBc1JldHVyblZhbHVlQiIpOwotCQlhc3NlcnROb3ROdWxsKHR5cGUpOwotCQl2YWxpZGF0b3IudmFsaWRhdGUodHlwZSk7Ci0KLQkJLy8gY2hlY2sgY2lyY3VsYXIgcmVmZXJlbmNlIHZpYSBtZW1iZXIgYW5kIHJldHVybiB2YWx1ZQotCQl0eXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuQ2lyY3VsYXJBc01peGVkUGFyYW1SZXR1cm5WYWx1ZUEiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUVudW1UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJSVR5cGUgdHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLkVudW1UeXBlIik7Ci0JCWFzc2VydE5vdE51bGwodHlwZSk7Ci0JCXZhbGlkYXRvci52YWxpZGF0ZSh0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVJbnRlcmZhY2VJbk9iamVjdEZhY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlmaW5hbCBTdHJpbmcgUENLMSA9ICJvcmcuZWNsaXBzZS50ZXN0LmltcGxlbWVudGVkIjsKLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gZ2V0VGVzdFByb2plY3QoKS5jcmVhdGVQYWNrYWdlKFBDSzEpOwotCi0JCWZpbmFsIElUeXBlIHR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmNyZWF0ZVR5cGUocGFjaywgIkltcGxlbWVudGVkSW50ZXJmYWNlLmphdmEiLCAgInB1YmxpYyBpbnRlcmZhY2UgSW1wbGVtZW50ZWRJbnRlcmZhY2Uge30iKTsKLQkJZ2V0VGVzdFByb2plY3QoKS5jcmVhdGVUeXBlKHBhY2ssICJPYmplY3RGYWN0b3J5LmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsiICsKLQkJCSIJcHVibGljIEltcGxlbWVudGVkSW50ZXJmYWNlIGNyZWF0ZUltcGxlbWVudGVkSW50ZXJmYWNlKCkgeyIgKwotCQkJIgkJcmV0dXJuIG51bGw7IiArCi0JCQkiCX0iICsKLQkJCSJ9Iik7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVBhcmFtZXRlcml6ZWRNZXRob2RQYXJhbWV0ZXJDbGFzcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEluYWRtaXNzYWJsZVR5cGVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElUeXBlIHBhcmFtZXRlcml6ZWRUeXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlKGdldFByb2plY3ROYW1lKCksIFBDSyArICIuUGFyYW1ldGVyaXplZENsYXNzIik7Ci0JCWFzc2VydE5vdE51bGwocGFyYW1ldGVyaXplZFR5cGUpOwotCQlmaW5hbCBJVHlwZSBlbmRwb2ludFR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5QYXJhbWV0ZXJpemVkTWV0aG9kUGFyYW1ldGVyRW5kcG9pbnRDbGFzcyIpOwotCQlhc3NlcnROb3ROdWxsKGVuZHBvaW50VHlwZSk7Ci0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHBhcmFtZXRlcml6ZWRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVQYXJhbWV0ZXJpemVkUmV0dXJuVHlwZUNsYXNzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgSW5hZG1pc3NhYmxlVHlwZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVR5cGUgcGFyYW1ldGVyaXplZFR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGUoZ2V0UHJvamVjdE5hbWUoKSwgUENLICsgIi5QYXJhbWV0ZXJpemVkQ2xhc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbWV0ZXJpemVkVHlwZSk7Ci0JCWZpbmFsIElUeXBlIGVuZHBvaW50VHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZShnZXRQcm9qZWN0TmFtZSgpLCBQQ0sgKyAiLlBhcmFtZXRlcml6ZWRNZXRob2RSZXR1cm5UeXBlRW5kcG9pbnRDbGFzcyIpOwotCQlhc3NlcnROb3ROdWxsKGVuZHBvaW50VHlwZSk7Ci0KLQkJdmFsaWRhdG9yLnZhbGlkYXRlKHBhcmFtZXRlcml6ZWRUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL1NFSUltcGxlbWVudGF0aW9uVmFsaWRhdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9TRUlJbXBsZW1lbnRhdGlvblZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTM0MGMyNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL1NFSUltcGxlbWVudGF0aW9uVmFsaWRhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5TZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotDQotcHVibGljIGNsYXNzIFNFSUltcGxlbWVudGF0aW9uVmFsaWRhdG9yVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UudGVzdHMiOw0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KCJzcmMiLCBQQ0spOw0KLQkJY3JlYXRlQ2xhc3NlcygibW9jay9TRUlUZXN0cy5zcmMiKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VXNlQ2xhc3NGb3JTRUkoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5TRUlJc0NsYXNzIik7DQotCQkJbmV3IFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yKHNlaVR5cGUpOw0KLQkJCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZmFsc2UpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdCB3cm9uZyBpbXBsZW1lbnRhdGlvbiB2aWEgbm90IHNhbWUgcGFyYW1zIGFuZCByZXR1cm4gdHlwZS4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QmVhbkRvZXNOb3RJbXBsZW1ldHNTZWlEaWZmZXJlbnRNZXRob2RQYXJhbXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JTm90SW1wbGVtZW50ZWQiKTsNCi0JCUlUeXBlIGJlYW5UeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuTm90SW1wbGVtZW50ZWRNZXRob2RQYXJhbXNCZWFuIik7DQotDQotCQlTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3Ioc2VpVHlwZSk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShiZWFuVHlwZSk7DQotCQlhc3NlcnRFcXVhbHMoIlN0YXR1cyBub3QgY29ycmVjdCIsIElTdGF0dXMuRVJST1IsIHN0YXR1cy5nZXRTZXZlcml0eSgpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdCB3cm9uZyBpbXBsZW1lbnRhdGlvbiBkaWZmZXJlbnQgbWV0aG9kIGV4Y2VwdGlvaW5zLg0KLQkgKiANCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RCZWFuRG9lc05vdEltcGxlbWV0c1NlaURpZmZlcmVudEV4Y2VwdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JTm90SW1wbGVtZW50ZWQiKTsNCi0JCUlUeXBlIGJlYW5UeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuTm90SW1wbGVtZW50ZWRNZXRob2RFeGNlcHRpb25zQmVhbiIpOw0KLQ0KLQkJU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yKHNlaVR5cGUpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYmVhblR5cGUpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTdGF0dXMgbm90IGNvcnJlY3QiLCBJU3RhdHVzLkVSUk9SLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRlc3RzIHRoZSBjYXNlIHdoZW4gdGhlIGJlYW4gaW1wbGVtZW50cyB0aGUgU2VpIGJ5IGRlY2xhcmluZyB0aGUgaW1wbGVtZW50YXRpb24uDQotCSAqIA0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEJlYW5JbXBsZW1lbnRzU2VpKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlJVHlwZSBzZWlUeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuSUltcGxlbWVudGVkIik7DQotCQlJVHlwZSBiZWFuVHlwZSA9IGdldFRlc3RQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShQQ0sgKyAiLkJlYW5JbXBsZW1lbnRzU2VpIik7DQotDQotCQlTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3Ioc2VpVHlwZSk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShiZWFuVHlwZSk7DQotCQlhc3NlcnRFcXVhbHMoIlN0YXVzIG5vdCBjb3JyZWN0IiwgSVN0YXR1cy5PSywgc3RhdHVzLmdldFNldmVyaXR5KCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGUgY2FzZSB3aGVuIHRoZSBiZWFuIGltcGxlbWVudHMgbWV0aG9kcyBmcm9tIFNlaSB3aXRob3QgZGlyZWN0bHkgaW1wbGVtZW50aW5nIGl0IHZpYSBqYXZhIGRlY2xhcmF0aW9uLg0KLQkgKiANCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RTRUlJbXBsZW1lbnRlZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJSVR5cGUgc2VpVHlwZSA9IGdldFRlc3RQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShQQ0sgKyAiLklJbXBsZW1lbnRlZCIpOw0KLQkJSVR5cGUgYmVhblR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JbXBsZW1lbnRlZEJlYW4iKTsNCi0NCi0JCVNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvcihzZWlUeXBlKTsNCi0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLnZhbGlkYXRlKGJlYW5UeXBlKTsNCi0JCWFzc2VydEVxdWFscygiU3RhdXMgbm90IGNvcnJlY3QiLCBJU3RhdHVzLk9LLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFNFSUltcGxlbWVudGVkRXh0ZW5kZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JSW1wbGVtZW50ZWRFeHRlbmRlZCIpOw0KLQkJSVR5cGUgYmVhblR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JbXBsZW1lbnRlZEV4dGVuZGVkQmVhbiIpOw0KLQ0KLQkJU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yKHNlaVR5cGUpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYmVhblR5cGUpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTdGF0dXMgbm90IGNvcnJlY3QiLCBJU3RhdHVzLk9LLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFNFSUltcGxlbWVudGVkTm9uUHVibGljTWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJSVR5cGUgc2VpVHlwZSA9IGdldFRlc3RQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShQQ0sgKyAiLklJbXBsZW1lbnRlZCIpOw0KLQkJSVR5cGUgYmVhblR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JbXBsZW1lbnRlZEJlYW4xIik7DQotDQotCQlTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3Ioc2VpVHlwZSk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShiZWFuVHlwZSk7DQotCQlhc3NlcnRFcXVhbHMoIlN0YXR1cyBub3QgY29ycmVjdCIsIElTdGF0dXMuRVJST1IsIHN0YXR1cy5nZXRTZXZlcml0eSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U0VJSW1wbGVtZW50ZWRXcm9uZ0V4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JRXhjZXB0aW9uc1VzZWQiKTsNCi0JCUlUeXBlIGJlYW5UeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuRXhjZXB0aW9uc1VzZWRCZWFuIik7DQotDQotCQlTZWlJbXBsZW1lbnRhdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3Ioc2VpVHlwZSk7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShiZWFuVHlwZSk7DQotCQlhc3NlcnRFcXVhbHMoIlN0YXR1cyBub3QgY29ycmVjdCIsIElTdGF0dXMuRVJST1IsIHN0YXR1cy5nZXRTZXZlcml0eSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U0VJSW1wbGVtZW50ZWRSaWdodEV4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUlUeXBlIHNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5JRXhjZXB0aW9uc1VzZWQiKTsNCi0JCUlUeXBlIGJlYW5UeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuRXhjZXB0aW9uc1VzZWRCZWFuMSIpOw0KLQ0KLQkJU2VpSW1wbGVtZW50YXRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNlaUltcGxlbWVudGF0aW9uVmFsaWRhdG9yKHNlaVR5cGUpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoYmVhblR5cGUpOw0KLQkJYXNzZXJ0RXF1YWxzKCJTdGF0dXMgbm90IGNvcnJlY3QiLCBJU3RhdHVzLk9LLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9TZWlWYWxpZGF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL1NlaVZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFlZTZkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL1NlaVZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudmFsaWRhdGlvbi5wcm92aWRlci5TZWlWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLQ0KLS8qKg0KLSAqIENsYXNzIHRlc3Rpbmcge0BsaW5rIFNlaVZhbGlkYXRvcn0NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaVZhbGlkYXRvclRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLnRlc3RzIjsNCi0NCi0JcHJpdmF0ZSBTZWlWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNlaVZhbGlkYXRvcigpOw0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KCJzcmMiLCBQQ0spOw0KLQkJY3JlYXRlQ2xhc3NlcygibW9jay9TRUlUZXN0cy5zcmMiKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgaW5jb3JyZWN0IGludGVyZmFjZSBkZWNsYXJhdGlvbnMNCi0JICogDQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0VXNlSW5jb3JyZWN0U0VJKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJVHlwZSBzZWlUeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuU0VJSXNDbGFzcyIpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoc2VpVHlwZSk7DQotDQotCQlhc3NlcnRFcXVhbHMoIlNldmVyaXR5IG5vdCBjb3JyZWN0Iiwgc3RhdHVzLmdldFNldmVyaXR5KCksIElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpcyBtaXNzaW5nIiwgc3RhdHVzLmdldE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsNCi0NCi0JCS8vIHRlc3RVc2VCaW5hcnlJbnRlcmZhY2VGb3JTRUkNCi0JCXNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoImphdmEudXRpbC5MaXN0Iik7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoc2VpVHlwZSk7DQotDQotCQlhc3NlcnRFcXVhbHMoIlNldmVyaXR5IG5vdCBjb3JyZWN0Iiwgc3RhdHVzLmdldFNldmVyaXR5KCksIElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpcyBtaXNzaW5nIiwgc3RhdHVzLmdldE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsNCi0NCi0JCXNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5TRUlJc0NsYXNzLkludGVybmFsU2VpIik7DQotCQlzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoc2VpVHlwZSk7DQotDQotCQlhc3NlcnRFcXVhbHMoIlNldmVyaXR5IG5vdCBjb3JyZWN0Iiwgc3RhdHVzLmdldFNldmVyaXR5KCksIElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpcyBtaXNzaW5nIiwgc3RhdHVzLmdldE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsNCi0NCi0JCXNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5TRUlOb3RQdWJsaWMiKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShzZWlUeXBlKTsNCi0NCi0JCWFzc2VydEVxdWFscygiU2V2ZXJpdHkgbm90IGNvcnJlY3QiLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGlzIG1pc3NpbmciLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyBpbmNvcnJlY3QgaW50ZXJmYWNlIG1ldGhkcw0KLQkgKiANCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RVc2VJbmNvcnJlY3RTZWlNZXRob2RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJVHlwZSBzZWlUeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuU0VJSW5jb3JyZWN0TWV0aG9kcyIpOw0KLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0b3IudmFsaWRhdGUoc2VpVHlwZSk7DQotDQotCQlhc3NlcnRFcXVhbHMoIlNldmVyaXR5IG5vdCBjb3JyZWN0Iiwgc3RhdHVzLmdldFNldmVyaXR5KCksIElTdGF0dXMuRVJST1IpOw0KLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpcyBtaXNzaW5nIiwgc3RhdHVzLmdldE1lc3NhZ2UoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsNCi0NCi0JCXNlaVR5cGUgPSBnZXRUZXN0UHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoUENLICsgIi5TRUlFeHRlbmRzU2VpV2l0aEluY29ycmVjdE1ldGhvZHMiKTsNCi0JCXN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShzZWlUeXBlKTsNCi0NCi0JCWFzc2VydEVxdWFscygiU2V2ZXJpdHkgbm90IGNvcnJlY3QiLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgSVN0YXR1cy5FUlJPUik7DQotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGlzIG1pc3NpbmciLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RVc2VDb3JyZWN0U2VpKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJVHlwZSBzZWlUeXBlID0gZ2V0VGVzdFByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKFBDSyArICIuSUltcGxlbWVudGVkIik7DQotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRvci52YWxpZGF0ZShzZWlUeXBlKTsNCi0NCi0JCWFzc2VydEVxdWFscygiU2V2ZXJpdHkgbm90IGNvcnJlY3QiLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgSVN0YXR1cy5PSyk7DQotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGlzIG5vdCBlbXB0eSIsIHN0YXR1cy5nZXRNZXNzYWdlKCkudHJpbSgpLmxlbmd0aCgpID09IDApOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vbW9jay9FbmRwb2ludC5zcmMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL21vY2svRW5kcG9pbnQuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTc1MDUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vbW9jay9FbmRwb2ludC5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludA0KLXsNCi0JcHVibGljIEVuZHBvaW50KCkgew0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHVzZVZvaWQoKSB7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBwcml2YXRlTWV0aG9kKCkgew0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBwcm90ZWN0ZWRNZXRob2QoKSB7DQotCX0JDQotCQ0KLQlwdWJsaWMgaW50W10gdXNlQXJyYXlBc1JldHVyblZhbHVlKCkgewkNCi0JCXJldHVybiBuZXcgaW50WzBdOw0KLQl9DQotCQ0KLQlwdWJsaWMgaW50IHVzZUFycmF5QXNQYXJhbShpbnQgW10gYXJyKSB7CQ0KLQkJcmV0dXJuIDA7DQotCX0JDQotCQ0KLQlwdWJsaWMgamF2YS51dGlsLkxpc3Q8U3RyaW5nPiB1c2VHZW5lcmljc0FzKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBNeU1hcDxTdHJpbmcsIFN0cmluZz4gdXNlTXlNYXAoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIGphdmEudXRpbC5MaXN0PD8+IHVzZUdlbmVyaWNzQXMoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0JDQotCXB1YmxpYyBpbnQgdXNlTURBcnJheUFzUGFyYW0oaW50IFtdW11bXSBhcnIpIHsJDQotCQlyZXR1cm4gMDsNCi0JfQkNCi0JDQotCXB1YmxpYyBMaXN0PExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4+IHVzZU5lc3RlZEdlbmVyaWNzKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0JCQ0KLQkNCi0JcHVibGljIExpc3Q8PyBleHRlbmRzIFN0cmluZz4gdXNlRXh0ZW5kc0luR2VuZXJpY3MoKSB7CQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JCQ0KLQkNCi0JcHVibGljIExpc3Q8PyBzdXBlciBTdHJpbmc+IHVzZVN1cGVySW5HZW5lcmljcygpIHsJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkJDQotCQ0KLQlwdWJsaWMgTGlzdDxMaXN0PFN0cmluZz4+IHVzZVN1cGVySW5HZW5lcmljc0FzUGFyYW0oTGlzdDw/IHN1cGVyIFN0cmluZz4gcGFyYW0pIHsNCi0JCXJldHVybiBudWxsOw0KLQl9CQkNCi0JDQotCXB1YmxpYyBMaXN0PEJhc2VJbXBsZW1lbnRlZD4gdXNlSW1wbGVtZW50ZWRCYXNlSW5HZW5lcmljcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgamF2YXguY3J5cHRvLkNpcGhlciB1c2VVbnN1cHBvcnRlZEphdmFUeXBlKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotCQ0KLQlwdWJsaWMgamF2YS5uZXQuVVJJIHVzZVN1cHBvcnRlZEphdmFUeXBlKCkgew0KLQl9DQotCQ0KLQlwdWJsaWMgSW1wbGVtZW50c1JlbW90ZSB1c2VJbXBsZW1lbnRzUmVtb3RlKCkgew0KLQl9DQotCQ0KLQlwdWJsaWMgTm9EZWZhdWx0Q29uc3RydWN0b3IgdXNlTm9EZWZhdWx0Q29uc3RydWN0b3IoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIEhhc0luYWRtaXNhYmxlSW5uZXJDbGFzcyB1c2VIYXNJbmFkbWlzYWJsZUlubmVyQ2xhc3MoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdXNlVXNlc1Vuc3VwcG9ydGVkQXNGaWVsZChVc2VzVW5zdXBwb3J0ZWRBc0ZpZWxkIHBhcmFtKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLy8gSW1wbGVtZW50YXRpb24gY2FzZXMNCi0JcHVibGljIEJhc2VOb3RJbXBsZW1lbnRlZCB1c2VOb3RJbXBsZW1lbnRlZEFic3RyYWN0Q2xhc3MoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIEJhc2VJbXBsZW1lbnRlZCB1c2VJbXBsZW1lbnRlZEFic3RyYWN0Q2xhc3MoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIEludGVyZmFjZUltcGxlbWVudGVkIHVzZUludGVyZmFjZSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgRW51bVR5cGUgdXNlRW51bSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9CQ0KLQkNCi0JLy8gSW5oZXJpdGFuY2UgY2FzZXMNCi0JcHVibGljIHZvaWQgdXNlTXVsdHlJbmhlcml0YW5jZVVzZUNsYXNzKE11bHR5SW5oZXJpdGFuY2VVc2VDbGFzcyBwYXJhbSkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEJhc2VDbGFzcyB1c2VTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEJhc2VDbGFzcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhJbnRlcmZhY2UgdXNlU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhJbnRlcmZhY2UoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi0NCi0JLy8gVXNpbmcgZXhjZXB0aW9ucyBtZXRob2RzCQ0KLQlwdWJsaWMgdm9pZCB1c2VFeGNlcHRpb24oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCB1c2VDdXN0b21FeGNlcHRpb24oKSB0aHJvd3MgQ3VzdG9tRXhjZXB0aW9uIHsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL21vY2svUnVudGltZUNsYXNzZXMuc3JjIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdGVzdHMvdmFsaWRhdGlvbi9tb2NrL1J1bnRpbWVDbGFzc2VzLnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdiYjA3YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL21vY2svUnVudGltZUNsYXNzZXMuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLQotI0ltcGxlbWVudHNSZW1vdGUKLXB1YmxpYyBjbGFzcyBJbXBsZW1lbnRzUmVtb3RlIGltcGxlbWVudHMgamF2YS5ybWkuUmVtb3RlCi17Ci19Ci0KLSNOb0RlZmF1bHRDb25zdHJ1Y3RvcgotcHVibGljIGNsYXNzIE5vRGVmYXVsdENvbnN0cnVjdG9yIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwdWJsaWMgTm9EZWZhdWx0Q29uc3RydWN0b3IoU3RyaW5nIHBhcmFtKSB7Ci0JfQotfQotCi0jTm9EZWZhdWx0Q29uc3RydWN0b3JQcml2YXRlQ29uc3RydWN0b3JzCi1wdWJsaWMgY2xhc3MgTm9EZWZhdWx0Q29uc3RydWN0b3JQcml2YXRlQ29uc3RydWN0b3JzIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIE5vRGVmYXVsdENvbnN0cnVjdG9yUHJpdmF0ZUNvbnN0cnVjdG9ycyhTdHJpbmcgcGFyYW0pIHsKLQl9Ci19Ci0KLSNIYXNJbmFkbWlzYWJsZUlubmVyQ2xhc3MKLXB1YmxpYyBjbGFzcyBIYXNJbmFkbWlzYWJsZUlubmVyQ2xhc3MgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSAKLXsKLQlwdWJsaWMgY2xhc3MgSW5uZXJDbGFzcyB7CQotCX0KLX0KLQotI1VzZXNVbnN1cHBvcnRlZEFzRmllbGQKLXB1YmxpYyBjbGFzcyBVc2VzVW5zdXBwb3J0ZWRBc0ZpZWxkIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwdWJsaWMgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkIGZpZWxkOwotfQotCi0jVXNlc1Vuc3VwcG9ydGVkQXNQcm9wZXJ0eQotcHVibGljIGNsYXNzIFVzZXNVbnN1cHBvcnRlZEFzUHJvcGVydHkgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotCXB1YmxpYyBVc2VzVW5zdXBwb3J0ZWRBc1Byb3BlcnR5KCkgewotCX0JCi0JCi0JcHVibGljIE5vRGVmYXVsdENvbnN0cnVjdG9yW10gZ2V0UmVjb3JkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLSNVc2VzVW5zdXBwb3J0ZWRJbk1ldGhvZAotcHVibGljIGNsYXNzIFVzZXNVbnN1cHBvcnRlZEluTWV0aG9kCi17Ci0JcHVibGljIGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZCBbXVtdIG90aGVyTWV0aG9kKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCXB1YmxpYyBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQgW11bXSB2YWxpZGF0ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQotCi0jVXNlc1Vuc3VwcG9ydGVkSW5UcmFuc2llbnRNZXRob2QKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKLXB1YmxpYyBjbGFzcyBVc2VzVW5zdXBwb3J0ZWRJblRyYW5zaWVudE1ldGhvZAotewotCUBYbWxUcmFuc2llbnQKLQlwdWJsaWMgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkIGdldExvZ1JlY29yZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQotCi0jV2ViRmF1bHRDbGFzcwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKLUBXZWJGYXVsdAotcHVibGljIGNsYXNzIFdlYkZhdWx0Q2xhc3MKLXsKLQlwdWJsaWMgV2ViRmF1bHRDbGFzcyhTdHJpbmcgYSkgewotCX0KLX0KLQotI1htbFR5cGVDbGFzcwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLUBYbWxUeXBlCi1wdWJsaWMgY2xhc3MgWG1sVHlwZUNsYXNzCi17Ci0JcHVibGljIFhtbFR5cGVDbGFzcyhTdHJpbmcgYSkgewotCX0KLX0KLQotI0Jhc2VOb3RJbXBsZW1lbnRlZAotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb3RJbXBsZW1lbnRlZAotewotfQotCi0jQmFzZUltcGxlbWVudGVkTm90Q29ycmVjdGx5Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUltcGxlbWVudGVkTm90Q29ycmVjdGx5Ci17Ci19Ci0KLSNCYXNlSW1wbGVtZW50ZWROb3RDb3JyZWN0bHlFeHRlbmRvcgotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VJbXBsZW1lbnRlZE5vdENvcnJlY3RseUV4dGVuZG9yCi17Ci19Ci0KLSNCYXNlSW1wbGVtZW50ZWROb3RDb3JyZWN0bHlJbXBsZW1lbnRvcgotcHVibGljIGNsYXNzIEJhc2VJbXBsZW1lbnRlZE5vdENvcnJlY3RseUltcGxlbWVudG9yIGV4dGVuZHMgQmFzZUltcGxlbWVudGVkTm90Q29ycmVjdGx5RXh0ZW5kb3IKLXsKLX0KLQotI0Jhc2VJbXBsZW1lbnRlZAotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VJbXBsZW1lbnRlZAotewotfQotCi0jQmFzZUltcGxlbWVudGVkSW1wbGVtZW50b3IKLXB1YmxpYyBjbGFzcyBCYXNlSW1wbGVtZW50ZWRJbXBsZW1lbnRvciBleHRlbmRzIEJhc2VJbXBsZW1lbnRlZCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci19Ci0KLSNJbnRlcmZhY2VOb3RJbXBsZW1lbnRlZAotcHVibGljIGludGVyZmFjZSBJbnRlcmZhY2VOb3RJbXBsZW1lbnRlZAotewotfQotCi0jSW50ZXJmYWNlSW1wbGVtZW50ZWQKLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJmYWNlSW1wbGVtZW50ZWQKLXsKLX0KLQotI0ludGVyZmFjZUltcGxlbWVudGVkSW1wbGVtZW50b3IKLXB1YmxpYyBjbGFzcyBJbnRlcmZhY2VJbXBsZW1lbnRlZEltcGxlbWVudG9yIGltcGxlbWVudHMgSW50ZXJmYWNlSW1wbGVtZW50ZWQsIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci19Ci0KLSNFbnVtVHlwZQotcHVibGljIGVudW0gRW51bVR5cGUgewotCVN0cmluZ1R5cGUsCi0JSW50VHlwZSwKLQlGbG9hdFR5cGUKLX0KLQotI011bHR5SW5oZXJpdGFuY2VVc2VDbGFzcwotcHVibGljIGNsYXNzIE11bHR5SW5oZXJpdGFuY2VVc2VDbGFzcyBleHRlbmRzIEJhc2VJbXBsZW1lbnRlZCBpbXBsZW1lbnRzIEludGVyZmFjZUltcGxlbWVudGVkLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotfQotCi0jTXVsdHlJbmhlcml0YW5jZVVzZUludGVyZmFjZXMKLXB1YmxpYyBjbGFzcyBNdWx0eUluaGVyaXRhbmNlVXNlSW50ZXJmYWNlcyBpbXBsZW1lbnRzIEludGVyZmFjZUltcGxlbWVudGVkLCBJbnRlcmZhY2VOb3RJbXBsZW1lbnRlZAotewotfQotCi0jU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhCYXNlQ2xhc3MKLXB1YmxpYyBjbGFzcyBTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEJhc2VDbGFzcyBleHRlbmRzIEJhc2VJbXBsZW1lbnRlZCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlLCBqYXZhLmxhbmcuQ2xvbmVhYmxlLCBqYXZhLmxhbmcuQ29tcGFyYWJsZSB7Ci0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IGFyZzApIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0jU3VwcG9ydGVkTXVsdHlJbmhlcml0YW5jZVdpdGhJbnRlcmZhY2UKLXB1YmxpYyBjbGFzcyBTdXBwb3J0ZWRNdWx0eUluaGVyaXRhbmNlV2l0aEludGVyZmFjZSBpbXBsZW1lbnRzIEludGVyZmFjZUltcGxlbWVudGVkLCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlIHsKLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgYXJnMCkgewotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLSNDb250YWluc0xpc3QKLXB1YmxpYyBjbGFzcyBDb250YWluc0xpc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JcHVibGljIGphdmEudXRpbC5NYXA8U3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxTdHJpbmc+PiBwYXJhbTsKLX0KLQotI0NvbnRhaW5zTm90U3VwcG9ydGVkSW5MaXN0Ci1wdWJsaWMgY2xhc3MgQ29udGFpbnNOb3RTdXBwb3J0ZWRJbkxpc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZD4gcGFyYW07Ci19Ci0KLSNDb250YWluc1F1b3RlSW5MaXN0Ci1wdWJsaWMgY2xhc3MgQ29udGFpbnNRdW90ZUluTGlzdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQlwdWJsaWMgamF2YS51dGlsLkxpc3Q8Pz4gcGFyYW07Ci19Ci0KLSNDb250YWluc0V4dGVuZHNJbkxpc3QKLXB1YmxpYyBjbGFzcyBDb250YWluc0V4dGVuZHNJbkxpc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JcHVibGljIGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyBTdHJpbmc+IHBhcmFtOwotfQotCi0jQ29udGFpbnNTdXBlckluTGlzdAotcHVibGljIGNsYXNzIENvbnRhaW5zU3VwZXJJbkxpc3QgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0JcHVibGljIGphdmEudXRpbC5MaXN0PD8gc3VwZXIgIFN0cmluZz4gcGFyYW07Ci19Ci0KLSNDaXJjdWxhckFzUGFyYW1BCi1wdWJsaWMgY2xhc3MgQ2lyY3VsYXJBc1BhcmFtQSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIAotewotCXB1YmxpYyBDaXJjdWxhckFzUGFyYW1CIGNCOwotfQotCi0jQ2lyY3VsYXJBc1BhcmFtQgotcHVibGljIGNsYXNzIENpcmN1bGFyQXNQYXJhbUIgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSAKLXsKLQlwdWJsaWMgQ2lyY3VsYXJBc1BhcmFtQSBjQTsKLX0KLQotI0NpcmN1bGFyQXNSZXR1cm5WYWx1ZUEKLXB1YmxpYyBjbGFzcyBDaXJjdWxhckFzUmV0dXJuVmFsdWVBIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgCi17Ci0JcHVibGljIENpcmN1bGFyQXNSZXR1cm5WYWx1ZUIgcmV0dXJuQ0IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQotI0NpcmN1bGFyQXNSZXR1cm5WYWx1ZUIKLXB1YmxpYyBjbGFzcyBDaXJjdWxhckFzUmV0dXJuVmFsdWVCIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgCi17Ci0JcHVibGljIENpcmN1bGFyQXNSZXR1cm5WYWx1ZUEgcmV0dXJuQ0EoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLQotI0NpcmN1bGFyQXNNaXhlZFBhcmFtUmV0dXJuVmFsdWVBCi1wdWJsaWMgY2xhc3MgQ2lyY3VsYXJBc01peGVkUGFyYW1SZXR1cm5WYWx1ZUEgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSAKLXsKLQlwdWJsaWMgQ2lyY3VsYXJBc01peGVkUGFyYW1SZXR1cm5WYWx1ZUIgY0I7Ci19Ci0KLSNDaXJjdWxhckFzTWl4ZWRQYXJhbVJldHVyblZhbHVlQgotcHVibGljIGNsYXNzIENpcmN1bGFyQXNNaXhlZFBhcmFtUmV0dXJuVmFsdWVCIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgCi17Ci0JcHVibGljIENpcmN1bGFyQXNNaXhlZFBhcmFtUmV0dXJuVmFsdWVBIHJldHVybkNBKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXNlQ2EoQ2lyY3VsYXJBc01peGVkUGFyYW1SZXR1cm5WYWx1ZUEgY0EpIHsKLQl9CQotfQotCi0jQ3VzdG9tRXhjZXB0aW9uCi1wdWJsaWMgY2xhc3MgQ3VzdG9tRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkV4Y2VwdGlvbiBpbXBsZW1lbnRzIEludGVyZmFjZUltcGxlbWVudGVkCi17Ci0JcHVibGljIEN1c3RvbUV4Y2VwdGlvbigpIAotCXsKLQkJc3VwZXIoKTsKLQl9Ci19Ci0KLSNNeVNldAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgTXlTZXQ8VD4gaW1wbGVtZW50cyBTZXQ8VD4gCi17Ci0JcHVibGljIGJvb2xlYW4gYWRkKFQgbykgeyByZXR1cm4gZmFsc2U7IH0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVD4gYykgeyByZXR1cm4gZmFsc2U7IH0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHt9Ci0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsJcmV0dXJuIGZhbHNlOyB9Ci0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7IHJldHVybiBmYWxzZTsgfQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7IHJldHVybiBmYWxzZTsgfQotCXB1YmxpYyBJdGVyYXRvcjxUPiBpdGVyYXRvcigpIHsgcmV0dXJuIG51bGw7IH0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsgcmV0dXJuIGZhbHNlO30KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7IHJldHVybiBmYWxzZTsgfQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsgcmV0dXJuIGZhbHNlOyB9Ci0JcHVibGljIGludCBzaXplKCkgewlyZXR1cm4gMDsgfQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewlyZXR1cm4gbnVsbDsgfQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsJcmV0dXJuIG51bGw7fQotfQotCi0jTXlNYXAKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNeU1hcDxLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPgotewotCXB1YmxpYyB2b2lkIGNsZWFyKCkge30KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7IHJldHVybiBmYWxzZTsgfQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7IHJldHVybiBmYWxzZTsgfQotCXB1YmxpYyBTZXQ8amF2YS51dGlsLk1hcC5FbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7IHJldHVybiBudWxsOwl9Ci0JcHVibGljIFYgZ2V0KE9iamVjdCBrZXkpIHsgcmV0dXJuIG51bGw7IH0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeyByZXR1cm4gZmFsc2U7IH0KLQlwdWJsaWMgU2V0PEs+IGtleVNldCgpIHsgcmV0dXJuIG51bGw7IH0KLQlwdWJsaWMgViBwdXQoSyBrZXksIFYgdmFsdWUpIHsgcmV0dXJuIG51bGw7IH0KLQlwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gdCkge30KLQlwdWJsaWMgViByZW1vdmUoT2JqZWN0IGtleSkgeyByZXR1cm4gbnVsbDsgfQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsJcmV0dXJuIDA7IH0KLQlwdWJsaWMgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKSB7IHJldHVybiBudWxsOyB9Ci19Ci0KLSNQYXJhbWV0ZXJpemVkQ2xhc3MKLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJpemVkQ2xhc3M8VD4gewotCXB1YmxpYyBUIHZhbHVlOwotfQotCi0jUGFyYW1ldGVyaXplZE1ldGhvZFBhcmFtZXRlckVuZHBvaW50Q2xhc3MKLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJpemVkTWV0aG9kUGFyYW1ldGVyRW5kcG9pbnRDbGFzcyB7Ci0JcHVibGljIHZvaWQgdGVzdChQYXJhbWV0ZXJpemVkQ2xhc3M8U3RyaW5nPiBwYXJhbSkgewotCX0KLX0KLQotI1BhcmFtZXRlcml6ZWRNZXRob2RSZXR1cm5UeXBlRW5kcG9pbnRDbGFzcwotcHVibGljIGNsYXNzIFBhcmFtZXRlcml6ZWRNZXRob2RSZXR1cm5UeXBlRW5kcG9pbnRDbGFzcyB7Ci0JcHVibGljIFBhcmFtZXRlcml6ZWRDbGFzczxTdHJpbmc+IHRlc3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vbW9jay9TRUlUZXN0cy5zcmMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS90ZXN0cy92YWxpZGF0aW9uL21vY2svU0VJVGVzdHMuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MGZiMTk2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Rlc3RzL3ZhbGlkYXRpb24vbW9jay9TRUlUZXN0cy5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotI1NFSUlzQ2xhc3MNCi1wdWJsaWMgY2xhc3MgU0VJSXNDbGFzcw0KLXsNCi0JcHVibGljIFNFSUlzQ2xhc3MoU3RyaW5nIGEpIHsNCi0JfQ0KLQkNCi0JcHVibGljIGludGVyZmFjZSBJbnRlcm5hbFNlaSB7DQotCX0NCi19DQotDQotI1NFSU5vdFB1YmxpYw0KLWludGVyZmFjZSBTRUlOb3RQdWJsaWMNCi17DQotfQ0KLQ0KLSNTRUlJbmNvcnJlY3RNZXRob2RzDQotcHVibGljIGludGVyZmFjZSBTRUlJbmNvcnJlY3RNZXRob2RzDQotew0KLQlwdWJsaWMgU0VJSXNDbGFzcyBtZXRob2QxKCk7DQotfQ0KLQ0KLSNTRUlFeHRlbmRzU2VpV2l0aEluY29ycmVjdE1ldGhvZHMNCi1wdWJsaWMgaW50ZXJmYWNlIFNFSUV4dGVuZHNTZWlXaXRoSW5jb3JyZWN0TWV0aG9kcyBleHRlbmRzIFNFSUluY29ycmVjdE1ldGhvZHMNCi17DQotCXB1YmxpYyBTdHJpbmcgbWV0aG9kMigpOw0KLX0NCi0NCi0NCi0jSU5vdEltcGxlbWVudGVkDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vdEltcGxlbWVudGVkDQotew0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IG1ldGhvZChTdHJpbmcgcGFyYW0pIHRocm93cyBFeGNlcHRpb247DQotfQ0KLQ0KLSNOb3RJbXBsZW1lbnRlZE1ldGhvZFBhcmFtc0JlYW4NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotcHVibGljIGNsYXNzIE5vdEltcGxlbWVudGVkTWV0aG9kUGFyYW1zQmVhbg0KLXsNCi0JcHVibGljIFN0cmluZyBtZXRob2QoU3RyaW5nIGEpIHt9DQotCQ0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IG1ldGhvZChpbnQgYSkge30NCi0NCi0JcHVibGljIExpc3Q8U3RyaW5nPiBtZXRob2QoU3RyaW5nIHBhcmFtLCBpbnQgYSkge30NCi0JDQotCXB1YmxpYyB2b2lkIG1ldGhvZDEoTWFwPFN0cmluZywgTGlzdD4gcCkge30NCi19DQotDQotI05vdEltcGxlbWVudGVkTWV0aG9kRXhjZXB0aW9uc0JlYW4NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotcHVibGljIGNsYXNzIE5vdEltcGxlbWVudGVkTWV0aG9kRXhjZXB0aW9uc0JlYW4NCi17DQotCXB1YmxpYyBMaXN0PFN0cmluZz4gbWV0aG9kKFN0cmluZyBwYXJhbSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQotDQotI0lJbXBsZW1lbnRlZA0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1wdWJsaWMgaW50ZXJmYWNlIElJbXBsZW1lbnRlZA0KLXsNCi0JcHVibGljIExpc3Q8U3RyaW5nPiBtZXRob2QoU3RyaW5nIHBhcmFtKTsNCi0JDQotCXB1YmxpYyB2b2lkIG1ldGhvZDEoTWFwPFN0cmluZywgTGlzdD4gcCk7DQotfQ0KLQ0KLSNJbXBsZW1lbnRlZEJlYW5CYXNlDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLXB1YmxpYyBjbGFzcyBJbXBsZW1lbnRlZEJlYW5CYXNlIHsNCi0JcHVibGljIExpc3Q8U3RyaW5nPiBtZXRob2QoU3RyaW5nIHBhcmFtKSB7IHJldHVybiBudWxsOyB9DQotfQ0KLQ0KLSNCZWFuSW1wbGVtZW50c1NlaQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1wdWJsaWMgY2xhc3MgQmVhbkltcGxlbWVudHNTZWkgZXh0ZW5kcyBJbXBsZW1lbnRlZEJlYW5CYXNlIGltcGxlbWVudHMgSUltcGxlbWVudGVkIHsNCi0JcHVibGljIHZvaWQgbWV0aG9kMShNYXA8U3RyaW5nLCBMaXN0PiBwKSB7fQ0KLX0NCi0NCi0jSW1wbGVtZW50ZWRCZWFuDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLXB1YmxpYyBjbGFzcyBJbXBsZW1lbnRlZEJlYW4gZXh0ZW5kcyBJbXBsZW1lbnRlZEJlYW5CYXNlIHsNCi0JcHVibGljIHZvaWQgbWV0aG9kMShNYXA8U3RyaW5nLCBMaXN0PiBwKSB7fQ0KLX0NCi0NCi0NCi0jSUltcGxlbWVudGVkRXh0ZW5kZWQNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotcHVibGljIGludGVyZmFjZSBJSW1wbGVtZW50ZWRFeHRlbmRlZCBleHRlbmRzIElJbXBsZW1lbnRlZA0KLXsNCi0JcHVibGljIGludCBbXSBtZXRob2QyKFN0cmluZyBwMSwgZmxvYXQgcDIpOw0KLQkNCi0JcHVibGljIFN0cmluZyBbXVtdIG1ldGhvZDMoZG91YmxlIHAxKTsNCi19DQotDQotI0ltcGxlbWVudGVkRXh0ZW5kZWRCZWFuDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLXB1YmxpYyBjbGFzcyBJbXBsZW1lbnRlZEV4dGVuZGVkQmVhbg0KLXsNCi0JcHVibGljIExpc3Q8U3RyaW5nPiBtZXRob2QoU3RyaW5nIHBhcmFtKSB7IHJldHVybiBudWxsOyB9DQotCQ0KLQlwdWJsaWMgdm9pZCBtZXRob2QxKE1hcDxTdHJpbmcsIExpc3Q+IHApIHt9DQotCQ0KLQlwdWJsaWMgaW50IFtdIG1ldGhvZDIoU3RyaW5nIHAxLCBmbG9hdCBwMikgeyByZXR1cm4gbnVsbDsgfQ0KLQkNCi0JcHVibGljIFN0cmluZyBbXVtdIG1ldGhvZDMoZG91YmxlIHAxKSB7IHJldHVybiBudWxsOyB9DQotfQ0KLQ0KLSNJbXBsZW1lbnRlZEJlYW4xDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLS8vIHNob3VsZCBpbXBsZW1lbnQgSUltcGxlbWVudGVkDQotcHVibGljIGNsYXNzIEltcGxlbWVudGVkQmVhbjEgew0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IG1ldGhvZChTdHJpbmcgcGFyYW0pIHsgcmV0dXJuIG51bGw7IH0NCi0JDQotCXByb3RlY3RlZCB2b2lkIG1ldGhvZDEoTWFwPFN0cmluZywgTGlzdD4gcCkge30NCi19DQotDQotI015RXhjZXB0aW9uDQotcHVibGljIGNsYXNzIE15RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi19DQotDQotI0lFeGNlcHRpb25zVXNlZA0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VwdGlvbnNVc2VkIHsNCi0JcHVibGljIHZvaWQgbWV0aG9kKCkgdGhyb3dzIE15RXhjZXB0aW9uOwkNCi0JcHVibGljIHZvaWQgbWV0aG9kMSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uOw0KLX0NCi0NCi0jRXhjZXB0aW9uc1VzZWRCZWFuDQotcHVibGljIGNsYXNzIEV4Y2VwdGlvbnNVc2VkQmVhbiB7DQotCXB1YmxpYyB2b2lkIG1ldGhvZCgpIHt9DQotCXB1YmxpYyB2b2lkIG1ldGhvZDEoKSB0aHJvd3MgRXhjZXB0aW9uIHt9CQ0KLX0NCi0NCi0jRXhjZXB0aW9uc1VzZWRCZWFuMQ0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25zVXNlZEJlYW4xIHsNCi0JcHVibGljIHZvaWQgbWV0aG9kKCkgdGhyb3dzIG9yZy5lY2xpcHNlLnRlc3RzLk15RXhjZXB0aW9uIHt9DQotCXB1YmxpYyB2b2lkIG1ldGhvZDEoKSB0aHJvd3MgRXhjZXB0aW9uIHt9CQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTM0N2QxZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTA0ODRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0M2NiYzVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMNCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscywNCi0gb3JnLmptb2NrLA0KLSBvcmcuanVuaXQNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy5pbnRlcm5hbA0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiN2FjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzg4ZWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExNjhiNmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPURPTSBVSSBUZXN0cyAoSW5jdWJhdGlvbikNCi1CdW5kbGUtVmVuZG9yLjA9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmI0ZDg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy5pbnRlcm5hbC5BbGxEb21JdGVtUHJvdmlkZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLmludGVybmFsLkRPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdDsNCi0NCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHNTdWl0ZQ0KLXsNCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0Jew0KLQkJZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQ0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFsbERvbUl0ZW1Qcm92aWRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdC5jbGFzcyk7DQotCQkNCi0JCXJldHVybiBzdWl0ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0FsbERvbUl0ZW1Qcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvaW50ZXJuYWwvQWxsRG9tSXRlbVByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjM4Y2ViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvaW50ZXJuYWwvQWxsRG9tSXRlbVByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvci5Qcm9wZXJ0eVZhbHVlV3JhcHBlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSVdlYk1ldGhvZEl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5JV2ViUGFyYW1JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSVdlYlNlcnZpY2VJdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmptb2NrLk1vY2s7DQotDQotcHVibGljIGNsYXNzIEFsbERvbUl0ZW1Qcm92aWRlclRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UgDQotew0KLQlwcml2YXRlIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlcjsgDQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlpdGVtUHJvdmlkZXIgPSBuZXcgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkNCi0Jew0KLQkJaXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERPTUl0ZW1Qcm92aWRlcigpDQotCXsNCi0JCWFzc2VydE5vdE51bGwoaXRlbVByb3ZpZGVyLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsNCi0JCWl0ZW1Qcm92aWRlci5zZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShudWxsKTsNCi0JCWFzc2VydE5vdE51bGwoaXRlbVByb3ZpZGVyLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsNCi0JCWl0ZW1Qcm92aWRlci5yZW1vdmVMaXN0ZW5lcihudWxsKTsNCi0JCWFzc2VydE5vdE51bGwoaXRlbVByb3ZpZGVyLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyIGphdmFJdGVtUHJvdmlkZXIgPSAoSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyLmNyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnRBZGFwdGVyKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoamF2YUl0ZW1Qcm92aWRlcik7DQotCQkNCi0JCUxpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BEZXNjcyA9IGphdmFJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wRGVzY3MpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wRGVzY3Muc2l6ZSgpID4gMCk7DQotCQkNCi0JCU1vY2sgamF2YVdTRWxlbSA9IG1vY2soSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcyk7DQotCQlqYXZhV1NFbGVtLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJUZXN0TmFtZSIpKTsNCi0JCWFzc2VydE5vdE51bGwoamF2YUl0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0JCWFzc2VydE5vdE51bGwoamF2YUl0ZW1Qcm92aWRlci5nZXRUZXh0KGphdmFXU0VsZW0ucHJveHkoKSkpOw0KLQkJYXNzZXJ0TnVsbChqYXZhSXRlbVByb3ZpZGVyLmdldE5hbWVDYXRlZ29yeSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElTZXJ2aWNlRW5kcG9pbnRJdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyIHNlaUl0ZW1Qcm92aWRlciA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChzZWlJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSBzZWlJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wRGVzY3MpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wRGVzY3Muc2l6ZSgpID4gMCk7DQotCQkNCi0JCU1vY2sgc0VJRWxlbSA9IG1vY2soSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcyk7DQotCQlzRUlFbGVtLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJUZXN0TmFtZSIpKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpSXRlbVByb3ZpZGVyLmdldEltYWdlKG5ldyBPYmplY3QoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWlJdGVtUHJvdmlkZXIuZ2V0VGV4dChzRUlFbGVtLnByb3h5KCkpKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuRmVhdHVyZXMobnVsbCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWlJdGVtUHJvdmlkZXIuZ2V0TmFtZUNhdGVnb3J5KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SVdlYk1ldGhvZEl0ZW1Qcm92aWRlcigpDQotCXsNCi0JCUlXZWJNZXRob2RJdGVtUHJvdmlkZXIgbWV0aG9kSXRlbVByb3ZpZGVyID0gKElXZWJNZXRob2RJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlci5jcmVhdGVJV2ViTWV0aG9kQWRhcHRlcigpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEl0ZW1Qcm92aWRlcik7DQotCQkNCi0JCUxpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BEZXNjcyA9IG1ldGhvZEl0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG51bGwpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHByb3BEZXNjcyk7DQotCQlhc3NlcnRUcnVlKHByb3BEZXNjcy5zaXplKCkgPiAwKTsNCi0JCQ0KLQkJTW9jayB3TUVsZW0gPSBtb2NrKElXZWJNZXRob2QuY2xhc3MpOw0KLQkJd01FbGVtLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJUZXN0TmFtZSIpKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kSXRlbVByb3ZpZGVyLmdldEltYWdlKG5ldyBPYmplY3QoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RJdGVtUHJvdmlkZXIuZ2V0VGV4dCh3TUVsZW0ucHJveHkoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhudWxsKSk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEl0ZW1Qcm92aWRlci5nZXROYW1lQ2F0ZWdvcnkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJV2ViU2VydmljZUl0ZW1Qcm92aWRlcigpDQotCXsNCi0JCUlXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyIHdzSXRlbVByb3ZpZGVyID0gKElXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIuY3JlYXRlSVdlYlNlcnZpY2VBZGFwdGVyKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwod3NJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSB3c0l0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG51bGwpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHByb3BEZXNjcyk7DQotCQlhc3NlcnRUcnVlKHByb3BEZXNjcy5zaXplKCkgPiAwKTsNCi0JCQ0KLQkJTW9jayB3c0VsZW0gPSBtb2NrKElXZWJTZXJ2aWNlLmNsYXNzKTsNCi0JCXdzRWxlbS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiVGVzdE5hbWUiKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzSXRlbVByb3ZpZGVyLmdldEltYWdlKG5ldyBPYmplY3QoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c0l0ZW1Qcm92aWRlci5nZXRUZXh0KHdzRWxlbS5wcm94eSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzSXRlbVByb3ZpZGVyLmdldE5hbWVDYXRlZ29yeSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcigpDQotCXsNCi0JCUlXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlciB3c1Byb2pJdGVtUHJvdmlkZXIgPSAoSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0QWRhcHRlcigpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdzUHJvakl0ZW1Qcm92aWRlcik7DQotCQkNCi0JCUxpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BEZXNjcyA9IHdzUHJvakl0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG51bGwpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHByb3BEZXNjcyk7DQotCQlhc3NlcnRUcnVlKHByb3BEZXNjcy5zaXplKCkgPiAwKTsNCi0JCQ0KLQkJTW9jayB3c1Byb2pFbGVtID0gbW9jayhJV2ViU2VydmljZVByb2plY3QuY2xhc3MpOw0KLQkJd3NQcm9qRWxlbS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiVGVzdE5hbWUiKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzUHJvakl0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0JCWFzc2VydE5vdE51bGwod3NQcm9qSXRlbVByb3ZpZGVyLmdldFRleHQod3NQcm9qRWxlbS5wcm94eSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzUHJvakl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG51bGwpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElXZWJNZXRob2RJdGVtUHJvdmlkZXJHZXRJbXBsZW1lbnRhdGlvbigpDQotCXsNCi0JCUlXZWJNZXRob2RJdGVtUHJvdmlkZXIgbWV0aG9kSXRlbVByb3ZpZGVyID0gKElXZWJNZXRob2RJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlci5jcmVhdGVJV2ViTWV0aG9kQWRhcHRlcigpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlNb2NrIHdlYlBhcmFtMSA9IG1vY2soSVdlYlBhcmFtLmNsYXNzKTsNCi0JCXdlYlBhcmFtMS5leHBlY3RzKGF0TGVhc3RPbmNlKCkpLm1ldGhvZCgiZ2V0TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoIlBhcmFtMSIpKTsNCi0JCXdlYlBhcmFtMS5leHBlY3RzKGF0TGVhc3RPbmNlKCkpLm1ldGhvZCgiZ2V0VHlwZU5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJib29sZWFuIikpOw0KLQkJTW9jayB3ZWJQYXJhbTIgPSBtb2NrKElXZWJQYXJhbS5jbGFzcyk7DQotCQl3ZWJQYXJhbTIuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJyZXR1cm4iKSk7DQotCQl3ZWJQYXJhbTIuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldFR5cGVOYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiamF2YS5sYW5nLlN0cmluZyIpKTsNCi0JCW9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDxJV2ViUGFyYW0+IHdlYlBhcmFtcyA9IG5ldyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDxJV2ViUGFyYW0+KCk7DQotCQl3ZWJQYXJhbXMuYWRkKChJV2ViUGFyYW0pd2ViUGFyYW0xLnByb3h5KCkpOw0KLQkJd2ViUGFyYW1zLmFkZCgoSVdlYlBhcmFtKXdlYlBhcmFtMi5wcm94eSgpKTsNCi0JCU1vY2sgd2ViTWV0aG9kID0gbW9jayhJV2ViTWV0aG9kLmNsYXNzKTsNCi0JCXdlYk1ldGhvZC5leHBlY3RzKGF0TGVhc3RPbmNlKCkpLm1ldGhvZCgiZ2V0UGFyYW1ldGVycyIpLndpbGwocmV0dXJuVmFsdWUod2ViUGFyYW1zKSk7DQotCQl3ZWJNZXRob2QuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldEltcGxlbWVudGF0aW9uIikud2lsbChyZXR1cm5WYWx1ZSgidGVzdE1ldGhvZChCKVFTdHJpbmciKSk7DQotCQkNCi0JCUJhc2ljRUxpc3Q8U3RhdGVBZGFwdGVyPiBhZGFwdGVycyA9IG5ldyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDxTdGF0ZUFkYXB0ZXI+KCk7DQotCQlNb2NrIGFkYXB0ZXIgPSBtb2NrKFN0YXRlQWRhcHRlci5jbGFzcyk7DQotCQlhZGFwdGVyLnN0dWJzKCkubWV0aG9kKCJpc0FkYXB0ZXJGb3JUeXBlIikud2lsbChyZXR1cm5WYWx1ZSh0cnVlKSk7DQotCQlhZGFwdGVyLnN0dWJzKCkubWV0aG9kKCJpc0NoYW5nZWFibGUiKS53aWxsKHJldHVyblZhbHVlKGZhbHNlKSk7DQotCQlhZGFwdGVycy5hZGQoKFN0YXRlQWRhcHRlcilhZGFwdGVyLnByb3h5KCkpOw0KLQkJDQotCQl3ZWJNZXRob2QuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImVBZGFwdGVycyIpLndpbGwocmV0dXJuVmFsdWUoYWRhcHRlcnMpKTsNCi0JCSgoSVdlYk1ldGhvZCl3ZWJNZXRob2QucHJveHkoKSkuZUFkYXB0ZXJzKCk7DQotCQltZXRob2RJdGVtUHJvdmlkZXIuc2V0VGFyZ2V0KChOb3RpZmllcil3ZWJNZXRob2QucHJveHkoKSk7DQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSBtZXRob2RJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyh3ZWJNZXRob2QucHJveHkoKSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwocHJvcERlc2NzKTsNCi0JCWFzc2VydFRydWUocHJvcERlc2NzLnNpemUoKSA+IDApOw0KLQkJDQotCQlmb3IoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcERlc2MgOiBwcm9wRGVzY3MpDQotCQl7DQotCQkJaWYocHJvcERlc2MuZ2V0RmVhdHVyZShudWxsKS5lcXVhbHMoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTikpDQotCQkJew0KLQkJCQlhc3NlcnRFcXVhbHMoKChQcm9wZXJ0eVZhbHVlV3JhcHBlcilwcm9wRGVzYy5nZXRQcm9wZXJ0eVZhbHVlKHdlYk1ldGhvZC5wcm94eSgpKSkuZ2V0VGV4dChudWxsKSwgIlN0cmluZyB0ZXN0TWV0aG9kKGJvb2xlYW4pIik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SVdlYlBhcmFtSXRlbVByb3ZpZGVyKCkNCi0Jew0KLQkJSVdlYlBhcmFtSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJV2ViUGFyYW1JdGVtUHJvdmlkZXIpIG5ldyBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLmNyZWF0ZUlXZWJQYXJhbUFkYXB0ZXIoKTsNCi0JCU1vY2sgcGFyYW1Nb2NrID0gbW9jayhJV2ViUGFyYW0uY2xhc3MpOwkJDQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0NCi0JCXBhcmFtTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoIm15UGFyYW0iKSk7DQotCQlwYXJhbU1vY2suc3R1YnMoKS5tZXRob2QoImdldFR5cGVOYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiamF2YS51dGlsLkxpc3QiKSk7DQotCQlwYXJhbU1vY2suc3R1YnMoKS5tZXRob2QoImdldEltcGxlbWVudGF0aW9uIikud2lsbChyZXR1cm5WYWx1ZSgidGVzdCIpKTsNCi0JCXBhcmFtTW9jay5zdHVicygpLm1ldGhvZCgiZUNvbnRhaW5lciIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJcGFyYW1Nb2NrLnN0dWJzKCkubWV0aG9kKCJlUmVzb3VyY2UiKS53aWxsKHJldHVyblZhbHVlKG51bGwpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJteVBhcmFtIiwgaXRlbVByb3ZpZGVyLmdldFRleHQocGFyYW1Nb2NrLnByb3h5KCkpKTsNCi0JCWFzc2VydE5vdE51bGwoaXRlbVByb3ZpZGVyLmdldEltYWdlKHBhcmFtTW9jay5wcm94eSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXROYW1lQ2F0ZWdvcnkoKSk7DQotCQlwYXJhbU1vY2suc3R1YnMoKS5tZXRob2QoImdldEltcGxlbWVudGF0aW9uIikud2lsbChyZXR1cm5WYWx1ZSgicmV0dXJuIikpOw0KLQkJYXNzZXJ0Tm90TnVsbChpdGVtUHJvdmlkZXIuZ2V0SW1hZ2UocGFyYW1Nb2NrLnByb3h5KCkpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJV2ViUGFyYW1JdGVtUHJvdmlkZXJGb3JUeXBlTmFtZSgpDQotCXsNCi0JCS8vIElXZWJQYXJhbUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVdlYlBhcmFtSXRlbVByb3ZpZGVyKSBuZXcgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKS5jcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCk7DQotCQlmaW5hbCBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciB0eXBlTmFtZVByb3BlcnR5RGVzY3JpcHRvciA9IGZpbmRXZWJQYXJhbUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UWVBFX05BTUUpOw0KLQkJDQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViUGFyYW0oKTsNCi0JCXdlYlBhcmFtLnNldEhlYWRlcih0cnVlKTsNCi0JCXdlYlBhcmFtLnNldEtpbmQoV2ViUGFyYW1LaW5kLklOT1VUKTsNCi0JCXdlYlBhcmFtLnNldE5hbWUoImFueU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJd2ViUGFyYW0uc2V0UGFydE5hbWUoImFueVBhcnROYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCXdlYlBhcmFtLnNldFRhcmdldE5hbWVzcGFjZSgiYW55VGFyZ2V0TmFtZXNwYWNlIik7IC8vJE5PTi1OTFMtMSQNCi0JCSgoRU9iamVjdCkgd2ViUGFyYW0pLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UWVBFX05BTUUsIG51bGwpOw0KLQkJCQkNCi0JCWFzc2VydE51bGwoIlVuZXhwZWN0ZWQgdmFsdWUuIiwgdHlwZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSh3ZWJQYXJhbSkpOyAvLyROT04tTkxTLTEkDQotDQotCQlPYmplY3QgcHJvcGVydHlWYWx1ZVdyYXBwZXIgPSBudWxsOw0KLQkJDQotCQkoKEVPYmplY3QpIHdlYlBhcmFtKS5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLCAiSSIpOyAvLyROT04tTkxTLTEkDQotCQlwcm9wZXJ0eVZhbHVlV3JhcHBlciA9IHR5cGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUod2ViUGFyYW0pOwkJDQotCQlhc3NlcnRFcXVhbHMoIlVucmVzb2x2ZWQgdmFsdWUuIiwgImludCIsICgoSUl0ZW1Qcm9wZXJ0eVNvdXJjZSkgcHJvcGVydHlWYWx1ZVdyYXBwZXIpLmdldEVkaXRhYmxlVmFsdWUobnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQ0KLQkJKChFT2JqZWN0KSB3ZWJQYXJhbSkuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RZUEVfTkFNRSwgIltRU3RyaW5nOyIpOyAvLyROT04tTkxTLTEkDQotCQlwcm9wZXJ0eVZhbHVlV3JhcHBlciA9IHR5cGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUod2ViUGFyYW0pOwkJDQotCQlhc3NlcnRFcXVhbHMoIlVucmVzb2x2ZWQgdmFsdWUuIiwgIlN0cmluZ1tdIiwgKChJSXRlbVByb3BlcnR5U291cmNlKSBwcm9wZXJ0eVZhbHVlV3JhcHBlcikuZ2V0RWRpdGFibGVWYWx1ZShudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQl9DQotCQ0KLQlwcml2YXRlIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGZpbmRXZWJQYXJhbUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoZmluYWwgRUF0dHJpYnV0ZSBhdHRyaWJ1dGUpDQotCXsNCi0JCWZpbmFsIElXZWJQYXJhbUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVdlYlBhcmFtSXRlbVByb3ZpZGVyKSBuZXcgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKS5jcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCk7DQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyA9IGl0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG51bGwpOw0KLQkJCQkJDQotCQlmb3IgKElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykJCQkNCi0JCXsNCi0JCQlpZiAoZGVzY3JpcHRvci5nZXRGZWF0dXJlKG51bGwpLmVxdWFscyhhdHRyaWJ1dGUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGRlc2NyaXB0b3I7CQkJCQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBpbnRlcmZhY2UgU3RhdGVBZGFwdGVyIGV4dGVuZHMgSVByb3BlcnR5U3RhdGUsIEFkYXB0ZXINCi0Jew0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvaW50ZXJuYWwvRE9NSXRlbVByb3BlcnR5UHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0RPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmJmY2RkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvaW50ZXJuYWwvRE9NSXRlbVByb3BlcnR5UHJvdmlkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMuaW50ZXJuYWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbC5ET01JdGVtUHJvcGVydHlQcm92aWRlcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyfSBjbGFzcw0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwcml2YXRlIERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyIHByb3ZpZGVyOw0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlwcm92aWRlciA9IG5ldyBET01JdGVtUHJvcGVydHlQcm92aWRlcigNCi0JCQkJbnVsbCwNCi0JCQkJbnVsbCwNCi0JCQkJImRpc3BsYXkgbmFtZSIsDQotCQkJCSJkZXNjcmlwdGlvbiIsDQotCQkJCURvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSwNCi0JCQkJdHJ1ZSwNCi0JCQkJZmFsc2UsDQotCQkJCWZhbHNlLA0KLQkJCQludWxsLCANCi0JCQkJImNhdGVnb3J5IiwNCi0JCQkJbmV3IFN0cmluZ1swXSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RSZXNldFByb3BlcnR5VmFsdWUoKQ0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQl3cy5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sICJvcmcuZWNsaXBzZS50ZXN0LlNlaSIpOw0KLQkJd3Muc2V0TmFtZSgiVGVzdCIpOw0KLQkJcHJvdmlkZXIucmVzZXRQcm9wZXJ0eVZhbHVlKHdzKTsNCi0JCWFzc2VydEVxdWFscygiU2VpU2VydmljZSIsIHdzLmdldE5hbWUoKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3YTM4MDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjUyN2M1Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuam1vY2ssDQotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZywNCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmp1bml0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlcywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jaywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiN2FjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzg4ZWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4MzAzOTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPVV0aWxpdGllcyBmb3IgSlVuaXQgdGVzdHMgKEluY3ViYXRpb24pDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9JV2FpdENvbmRpdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9JV2FpdENvbmRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTA4ZThmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvSVdhaXRDb25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlsczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLkNvbmRpdGlvbkNoZWNrRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB3aGljaCBkZWZpbmVzIGEgY29uZGl0aW9uIHVwb24gd2hpY2ggdGhlIGV4ZWN1dGlvbiBjYW4gY29udGludWUgDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXYWl0Q29uZGl0aW9uDQotew0KLQkvKioNCi0JICogTWV0aG9kIHdoaWNoIGNoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY29uZGl0aW9uIGlzIG1ldA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIGNvbmRpdGlvbiBpcyBtZXQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHRocm93cyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbiB3aGVuIGltcGxlbWVudG9ycyBkZWNpZGUgdGhhdCB0aGV5IGNhbm5vdCBkZWFsIHdpdGggYSBnaXZlbiBleGNlcHRpb25hbCBzaXR1YXRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGNoZWNrQ29uZGl0aW9uKCkgdGhyb3dzIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2Fzc2VydGlvbnMvQXNzZXJ0aW9ucy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9hc3NlcnRpb25zL0Fzc2VydGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2ZiOWZmNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2Fzc2VydGlvbnMvQXNzZXJ0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLklXYWl0Q29uZGl0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZy5UZXN0Q29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIHdoaWNoIHByb3ZpZGVzIG1ldGhvZHMgd2hpY2ggYXNzZXJ0IHRoYXQgYSBnaXZlbiBjb25kaXRpb24gaXMgbWV0LiBJZiBuZWNlc3NhcnksIG1ldGhvZHMgd2lsbCBibG9jayB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjYWxsZXIgdW50aWwNCi0gKiB0aGUgY29uZGl0aW9uIGlzIG1ldCBmb3IgYSByZWFzb25hYmxlIHRpbWUuIElmIHRoZSBjb25kaXRpb25zIGlzIG5vdCBtZXQsIDxjb2RlPkFzc2VydC5mYWlsKCk8L2NvZGU+IGlzIGludm9rZWQNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBc3NlcnRpb25zDQotew0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX0NPTkRJVElPTl9DSEVDS1MgPSA1MDAwOw0KLQ0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0xFRVBfVElNRU9VVCA9IDQyOw0KLQ0KLQkvKioNCi0JICogQXNzZXJ0cyB0aGF0IHdhaXRzIHNvbWUgdGltZSB1bnRpbCB0aGUgY29uZGl0aW9uIHNwZWNpZmllZCBpcyBtZXQuIElmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldCBhZnRlciBzb21lIHJlYXNvbmFibGUgdGltZSwgdGhlIG1ldGhvZCBjYWxscyBBc3NlcnQuZmFpbCgpICANCi0JICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uIHRvIGNoZWNrDQotCSAqIEBwYXJhbSBmYWlsTWVzc2FnZSB0aGUgbWVzc2FnZSB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byA8Y29kZT5Bc3NlcnQuZmFpbCgpPC9jb2RlPiB0aHVzIGluZGljYXRpbmcgYSB0ZXN0IGZhaWx1cmUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0QXNzZXJ0KGZpbmFsIElXYWl0Q29uZGl0aW9uIGNvbmRpdGlvbiwgZmluYWwgU3RyaW5nIGZhaWxNZXNzYWdlKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlpZiAoIXdhaXRGb3JDb25kaXRpb25Mb29wKGNvbmRpdGlvbikpDQotCQkJew0KLQkJCQlBc3NlcnQuZmFpbChmYWlsTWVzc2FnZSk7DQotCQkJfQ0KLQkJfSBjYXRjaCAoQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlmYWlsVXBvblRocm93YWJsZShlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQmxvY2tzIHRoZSBleGVjdXRpb24gb2YgdGhlIGNhbGxlciB1bnRpbCB0aGUgPGNvZGU+Y29uZGl0aW9uPC9jb2RlPiBpcyBtZXQgb3IgTUFYX0NPTkRJVElPTl9DSEVDS1MgYXR0ZW1wdHMgaGF2ZSBiZWVuIHJlYWNoZWQuPGJyPg0KLQkgKiBUaGUgbWV0aG9kIGJlaGF2aW91ciBzbGlnaHRseSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gdGhlIFVJIHRocmVhZCBvciBub3QNCi0JICogPGxpPklmIHRoZSBjYWxsZXIgaXMgdGhlIFVJIHRocmVhZCwgYSBuZXcgbW9kYWwgY29udGV4dCB0aHJlYWQgaXMgc3RhcnRlZCB3aGljaCBzbGVlcHMgZm9yIHtAbGluayAjU0xFRVBfVElNRU9VVH0NCi0JICogPGxpPklmIHRoZSBjYWxsZXIgaXMgbm90IHRoZSBVSSB0aHJlYWQsIHRoZW4gdGhlIGN1cnJlbnQgdGhyZWFkIHNsZWVwcyBmb3Ige0BsaW5rICNTTEVFUF9USU1FT1VUfSA8YnI+DQotCSAqIA0KLQkgKiBAcGFyYW0gY29uZGl0aW9uDQotCSAqICAgICAgICAgICAgY29uZGl0aW9uIG9uIHdoaWNoIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gaWYgbWV0DQotCSAqIEB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gd2FpdEZvckNvbmRpdGlvbkxvb3AoZmluYWwgSVdhaXRDb25kaXRpb24gY29uZGl0aW9uKSB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24NCi0Jew0KLQkJaW50IGF0dGVtcHRzID0gMDsNCi0JCXdoaWxlIChhdHRlbXB0cyA8IE1BWF9DT05ESVRJT05fQ0hFQ0tTKQ0KLQkJew0KLQkJCWlmIChjb25kaXRpb24uY2hlY2tDb25kaXRpb24oKSkNCi0JCQl7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0NCi0JCQlhdHRlbXB0cysrOw0KLQkJCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBzbGVlcFJ1bm5hYmxlID0gZ2V0U2xlZXBSdW5uYWJsZSgpOw0KLQ0KLQkJCXRyeQ0KLQkJCXsNCi0JCQkJVGVzdENvbnRleHQucnVuKHNsZWVwUnVubmFibGUsIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpKTsNCi0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpDQotCQkJew0KLQkJCQl0aHJvdyBuZXcgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24oZSk7DQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihlKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldFNsZWVwUnVubmFibGUoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpDQotCQl7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uDQotCQkJew0KLQkJCQlUaHJlYWQuc2xlZXAoU0xFRVBfVElNRU9VVCk7DQotCQkJfQ0KLQkJfTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZhaWxVcG9uVGhyb3dhYmxlKGZpbmFsIFRocm93YWJsZSB0KQ0KLQl7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG1zZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih0LmdldE1lc3NhZ2UoKSk7DQotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLQkJUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsNCi0JCXQucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsNCi0JCW1zZ0J1aWxkZXIuYXBwZW5kKHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsNCi0JCW1zZ0J1aWxkZXIuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7DQotDQotCQlBc3NlcnQuZmFpbChtc2dCdWlsZGVyLnRvU3RyaW5nKCkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvYXNzZXJ0aW9ucy9Db25kaXRpb25DaGVja0V4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9hc3NlcnRpb25zL0NvbmRpdGlvbkNoZWNrRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllNjkxZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9hc3NlcnRpb25zL0NvbmRpdGlvbkNoZWNrRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5JV2FpdENvbmRpdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gd2hpY2ggY2FuIGJlIHRocm93biBieSB7QGxpbmsgSVdhaXRDb25kaXRpb24jY2hlY2tDb25kaXRpb24oKX0gbWV0aG9kLiBUaGlzIGlzIGEgd3JhcHBlciBleGNlcHRpb24gd2hpY2ggZW5jbG9zZXMgdGhlIGV4Y2VwdGlvbiBjYXVzZQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGNsYXNzIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDkyOTA4MDI4NTUwNjc4ODk4NEw7DQotDQotCXB1YmxpYyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihmaW5hbCBUaHJvd2FibGUgY2F1c2UpDQotCXsNCi0JCXN1cGVyKGNhdXNlKTsNCi0JfQ0KLQkNCi0JcHVibGljIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ZpbGVzL1Rlc3RGaWxlVXRpbHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvZmlsZXMvVGVzdEZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNTMyY2JkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvZmlsZXMvVGVzdEZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlczsNCi0NCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEZpbGVVdGlscw0KLXsNCi0JLy8gSGlkZSBkZWZhdWx0IGNvbnN0cnVjdG9yDQotCXByaXZhdGUgVGVzdEZpbGVVdGlscygpDQotCXsNCi0JfTsNCi0NCi0JLyoqIEdldCBuZXcgaW5zdGFuY2Ugb2YgdGhlIEZpbGVVdGlsaXRpZXMgb2JqZWN0ICovDQotCXB1YmxpYyBzdGF0aWMgVGVzdEZpbGVVdGlscyBnZXRJbnN0YW5jZSgpDQotCXsNCi0JCXJldHVybiBuZXcgVGVzdEZpbGVVdGlscygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBVdGlsaXR5IG1ldGhvZC4gQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGZvbGRlciB0byB0aGUgZGVzdGluYXRpb24gZm9sZGVyLg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gY29weUZpbGVzKGZpbmFsIEZpbGUgZGVzdCwgZmluYWwgRmlsZSBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotDQotCQlpZiAoc3JjLmlzRGlyZWN0b3J5KCkpDQotCQl7DQotCQkJZGVzdC5ta2RpcnMoKTsNCi0JCQlmaW5hbCBTdHJpbmcgbGlzdFtdID0gc3JjLmxpc3QoKTsNCi0NCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspDQotCQkJew0KLQkJCQlmaW5hbCBTdHJpbmcgZGVzdDEgPSBkZXN0LmdldEFic29sdXRlUGF0aCgpICsgIlxcIiArIGxpc3RbaV07DQotCQkJCWZpbmFsIFN0cmluZyBzcmMxID0gc3JjLmdldEFic29sdXRlUGF0aCgpICsgIlxcIiArIGxpc3RbaV07DQotCQkJCWNvcHlGaWxlcyhuZXcgRmlsZShkZXN0MSksIG5ldyBGaWxlKHNyYzEpKTsNCi0JCQl9DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlyZXR1cm4gY29weShkZXN0LCBzcmMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY29weWluZyBhIGZpbGUhIC0gbm90IGEgZGlyZWN0b3J5DQotCSAqIA0KLQkgKiBAcGFyYW0gdGFyZ2V0DQotCSAqIEBwYXJhbSBzb3VyY2UNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gY29weShmaW5hbCBGaWxlIHRhcmdldCwgZmluYWwgRmlsZSBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIXNvdXJjZS5pc0ZpbGUoKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlmaW5hbCBGaWxlQ2hhbm5lbCBzb3VyY2VDaGFubmVsID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpLmdldENoYW5uZWwoKTsNCi0JCWZpbmFsIEZpbGVDaGFubmVsIHRhcmdldENoYW5uZWwgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRhcmdldCkuZ2V0Q2hhbm5lbCgpOw0KLQkJc291cmNlQ2hhbm5lbC50cmFuc2ZlclRvKDAsIHNvdXJjZUNoYW5uZWwuc2l6ZSgpLCB0YXJnZXRDaGFubmVsKTsNCi0JCXNvdXJjZUNoYW5uZWwuY2xvc2UoKTsNCi0JCXRhcmdldENoYW5uZWwuY2xvc2UoKTsNCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiANCi0JICogQHBhcmFtIGRlc3REaXINCi0JICogQHBhcmFtIHNyY1JlbGF0aXZlUGF0aCAtDQotCSAqICAgICAgICAgICAgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHJlc291cmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIGluIHRoZSBzYW1lIHBhY2thZ2UNCi0JICogQHBhcmFtIHJlc291cmNlTmFtZQ0KLQkgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcw0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBGaWxlIGNvcHlSZXNvdXJjZVRvRGlyKEZpbGUgZGVzdERpciwgSW5wdXRTdHJlYW0gc3JjU3RyZWFtLCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCksIHJlc291cmNlTmFtZSk7DQotCQljb3B5RmlsZShzcmNTdHJlYW0sIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSk7DQotCQlyZXR1cm4gZGVzdEZpbGU7DQotCX0NCi0JLyoqDQotCSAqIA0KLQkgKiBAcGFyYW0gZGVzdERpcg0KLQkgKiBAcGFyYW0gc3JjUmVsYXRpdmVQYXRoIC0NCi0JICogICAgICAgICAgICB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgaW4gdGhlIHNhbWUgcGFja2FnZQ0KLQkgKiBAcGFyYW0gc3JjRmlsZU5hbWUNCi0JICogQHBhcmFtIHJlc291cmNlQ2xhc3MNCi0JICogQHJldHVybg0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgRmlsZSBjb3B5UmVzb3VyY2VUb0RpcihGaWxlIGRlc3REaXIsIFN0cmluZyBzcmNSZWxhdGl2ZVBhdGgsIFN0cmluZyBzcmNGaWxlTmFtZSwgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpLCBzcmNGaWxlTmFtZSk7DQotCQljb3B5RmlsZShjcmVhdGVJbnB1dFN0cmVhbUZvclJlc291cmNlKHNyY1JlbGF0aXZlUGF0aCwgc3JjRmlsZU5hbWUsIHJlc291cmNlQ2xhc3MpLCBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSkpOw0KLQkJcmV0dXJuIGRlc3RGaWxlOw0KLQl9DQotDQotCXByaXZhdGUgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW1Gb3JSZXNvdXJjZShTdHJpbmcgc3JjUmVsYXRpdmVQYXRoLCBTdHJpbmcgc3JjRmlsZU5hbWUsIENsYXNzPD8+IHJlc291cmNlQ2xhc3MpDQotCXsNCi0JCXJldHVybiByZXNvdXJjZUNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oY3JlYXRlUmVzb3VyY2VQYXRoKHNyY1JlbGF0aXZlUGF0aCkgKyBzcmNGaWxlTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUmVzb3VyY2VQYXRoKFN0cmluZyBzcmNSZWxhdGl2ZVBhdGgpDQotCXsNCi0JCXJldHVybiAoc3JjUmVsYXRpdmVQYXRoID09IG51bGwpID8gIiIgOiBzcmNSZWxhdGl2ZVBhdGggKyAiLyI7DQotCX0NCi0NCi0JLyoqIENsb3NlcyB0aGUgc3RyZWFtcyBhZnRlciBjb21wbGV0aW9uICovDQotCXB1YmxpYyB2b2lkIGNvcHlGaWxlKElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJaWYgKGluID09IG51bGwgfHwgb3V0ID09IG51bGwpDQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyZWFtIG5vdCBpbml0aWFsaXplZCIpOw0KLQkJdHJ5DQotCQl7DQotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOw0KLQkJCWludCBsZW47DQotCQkJd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID4gMCkNCi0JCQl7DQotCQkJCW91dC53cml0ZShidWYsIDAsIGxlbik7DQotCQkJfQ0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJaW4uY2xvc2UoKTsNCi0JCQlvdXQuY2xvc2UoKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVXRpbGl0eSBtZXRob2QgZm9yIGRlbGV0aW5nIHRoZSBjb250ZW50cyBvZiBhIGdpdmVuIGZvbGRlciBwYXRoDQotCSAqIA0KLQkgKiBAcGFyYW0gZm9sZGVyUGF0aA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9jZXNzIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Lg0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBkZWxldGVGb2xkZXJBbmRDb250ZW50cyhmaW5hbCBTdHJpbmcgZm9sZGVyUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIEZpbGUgcGF0aCA9IG5ldyBGaWxlKGZvbGRlclBhdGgpOw0KLQkJcmV0dXJuIGRlbGV0ZUZvbGRlckFuZENvbnRlbnRzKHBhdGgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgaXRzIGNvbnRlbnRzIGluY2x1ZGluZyBhbGwgc3ViIGRpcmVjdG9yaWVzLg0KLQkgKiANCi0JICogQHBhcmFtIHRlbXBEaXINCi0JICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IHRoYXQgaXMgYmVpbmcgZGVsZXRlZC4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZUZvbGRlckFuZENvbnRlbnRzKEZpbGUgdGVtcERpcikNCi0Jew0KLQkJYm9vbGVhbiBzdGF0dXMgPSB0cnVlOw0KLQkJaWYgKHRlbXBEaXIgIT0gbnVsbCkNCi0JCXsNCi0JCQlGaWxlW10gZmlsZXMgPSB0ZW1wRGlyLmxpc3RGaWxlcygpOw0KLQ0KLQkJCWlmIChmaWxlcyAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykNCi0JCQkJew0KLQkJCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpDQotCQkJCQl7DQotCQkJCQkJc3RhdHVzID0gZGVsZXRlRm9sZGVyQW5kQ29udGVudHMoZmlsZXNbaV0pICYmIHN0YXR1czsNCi0JCQkJCX0gZWxzZQ0KLQkJCQkJew0KLQkJCQkJCXN0YXR1cyA9IGZpbGVzW2ldLmRlbGV0ZSgpICYmIHN0YXR1czsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQlzdGF0dXMgPSB0ZW1wRGlyLmRlbGV0ZSgpICYmIHN0YXR1czsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXN0YXR1cyA9IGZhbHNlOw0KLQkJfQ0KLQkJcmV0dXJuIHN0YXR1czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gZmlsZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5Lg0KLQkgKiANCi0JICogQHBhcmFtIGlzdHINCi0JICogICAgICAgICAgICBUaGUgaW5wdXQgc3RyZWFtIG9mIHRoZSBqYXIgZmlsZQ0KLQkgKiBAcGFyYW0gc3JjRmlsZU5hbWUNCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYXJjaGl2ZSAtIHdoZXJlIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgc3RyZWFtIHdpbGwgYmUgY29waWVkDQotCSAqIEBwYXJhbSBkZXN0RGlyDQotCSAqICAgICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBvYmplY3QNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvY2VzcyB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiB1bnppcEFyY2hpdmVUb0RpcihmaW5hbCBJbnB1dFN0cmVhbSBpc3RyLCBmaW5hbCBTdHJpbmcgc3JjRmlsZU5hbWUsIGZpbmFsIEZpbGUgZGVzdERpcikgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0NCi0JCWlmICghZGVzdERpci5leGlzdHMoKSkNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCIpOw0KLQkJaWYgKCFkZXN0RGlyLmNhbldyaXRlKCkpDQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3Qgd3JpdGUgdG8gZGlyZWN0b3J5Iik7DQotDQotCQlmaW5hbCBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBzcmNGaWxlTmFtZSk7DQotDQotCQlmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZUZpbGUpOw0KLQkJZmluYWwgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYnVmT3V0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvcyk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlVbnppcHBlci5JTlNUQU5DRS5jb3B5SW5wdXRTdHJlYW0oaXN0ciwgYnVmT3V0U3RyZWFtKTsNCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCWJ1Zk91dFN0cmVhbS5jbG9zZSgpOw0KLQkJCWZvcy5jbG9zZSgpOw0KLQkJfQ0KLQ0KLQkJLy8gY2hlY2sgaWYgdGhlIGFyY2hpdmUgd2FzIGNvcGllZCBzdWNjZXNzZnVsbHkNCi0JCWlmICghc291cmNlRmlsZS5leGlzdHMoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJBcmNoaXZlIGNvdWxkIG5vdCBiZSBmb3VuZCIpOw0KLQkJfQ0KLQ0KLQkJVW56aXBwZXIuSU5TVEFOQ0UudW56aXAoc291cmNlRmlsZSwgZGVzdERpciwgZmFsc2UpOw0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLyoqIFV0aWxpdHkgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgdGhyb3VnaCBVUkwgKi8NCi0JcHVibGljIFN0cmluZyByZWFkVVJMUmVzb3VyY2UoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZyByZWFkSW5mID0gbnVsbDsNCi0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCWludCBpblJlYWQgPSBpbi5yZWFkKCk7DQotDQotCQkJcmVhZEluZiA9ICIiOw0KLQkJCXdoaWxlIChpblJlYWQgIT0gLTEpDQotCQkJew0KLQkJCQlyZWFkSW5mICs9IFN0cmluZy52YWx1ZU9mKChjaGFyKSBpblJlYWQpOw0KLQkJCQlpblJlYWQgPSBpbi5yZWFkKCk7DQotCQkJfQ0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJaW4uY2xvc2UoKTsNCi0JCX0NCi0NCi0JCXJldHVybiByZWFkSW5mOw0KLQl9DQotDQotCS8qKg0KLQkgKiBNZXRob2QgZm9yIHJlcGxhY2luZyB0aGUgdGV4dCBvY2N1cnJlbmNlIGluIGEgZmlsZSB3aXRoIHRoZSBwcm92aWRlZCByZXBsYWNlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlDQotCSAqIEBwYXJhbSBmaW5kDQotCSAqIEBwYXJhbSByZXBsYWNlbWVudA0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHJlcGxhY2VDb250ZW50c0luRmlsZShGaWxlIGZpbGUsIFN0cmluZyBmaW5kLCBTdHJpbmcgcmVwbGFjZW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJU3RyaW5nIGZpbGVDb250ZW50cyA9IHJlYWRGaWxlQ29udGVudHMoZmlsZSk7DQotDQotCQlmaWxlQ29udGVudHMgPSBmaWxlQ29udGVudHMucmVwbGFjZUFsbChmaW5kLCByZXBsYWNlbWVudCk7DQotDQotCQlmaWxlLmRlbGV0ZSgpOw0KLQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7DQotDQotCQl3cml0ZUNvbnRlbnRzVG9GaWxlKGZpbGUsIGZpbGVDb250ZW50cyk7DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogV3JpdGVzIHRoZSBzdHJpbmcgdG8gdGhlIGdpdmVuIGZpbGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZSAtDQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gd3JpdGUgdG8NCi0JICogQHBhcmFtIGZpbGVDb250ZW50cyAtDQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgd3JpdGVDb250ZW50c1RvRmlsZShGaWxlIGZpbGUsIFN0cmluZyBmaWxlQ29udGVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCXsNCi0NCi0JCVByaW50V3JpdGVyIHBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoZmlsZSk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlwb3V0LnByaW50bG4oZmlsZUNvbnRlbnRzKTsNCi0JCQlwb3V0LmZsdXNoKCk7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQlwb3V0LmNsb3NlKCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlYWRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYW5kIHJldHVybnMgaXQgYXMgU3RyaW5nLg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIHJlYWQgZnJvbQ0KLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIHJlYWRGaWxlQ29udGVudHMoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIHJlYWRJbmYgPSBudWxsOw0KLQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJaW50IGluUmVhZCA9IGluLnJlYWQoKTsNCi0NCi0JCQlyZWFkSW5mID0gIiI7DQotCQkJd2hpbGUgKGluUmVhZCAhPSAtMSkNCi0JCQl7DQotCQkJCXJlYWRJbmYgKz0gU3RyaW5nLnZhbHVlT2YoKGNoYXIpIGluUmVhZCk7DQotCQkJCWluUmVhZCA9IGluLnJlYWQoKTsNCi0JCQl9DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IGU7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQlpbi5jbG9zZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlYWRJbmY7DQotCX0NCi0NCi0JLyoqIEByZXR1cm4gdGhlIHJlc291cmNlIGlucHV0IHN0cmVhbSBvZiB0aGUgcHJvamVjdHMgYXJjaGl2ZSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlSW5wdXRTdHJlYW0oZmluYWwgU3RyaW5nIGFyY2hpdmVOYW1lLCBmaW5hbCBTdHJpbmcgcHJvamVjdFNvdXJjZUZvbGRlciwgQ2xhc3MgcmVsYXRpdmVSZXNvdXJjZUJhc2VDbGFzcykNCi0Jew0KLQkJcmV0dXJuIHJlbGF0aXZlUmVzb3VyY2VCYXNlQ2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShwcm9qZWN0U291cmNlRm9sZGVyICsgIi8iICsgYXJjaGl2ZU5hbWUpOw0KLQl9DQotDQotCS8qKiBNZXRob2QgZm9yIGhhbmRsaW5nIHRoZSB1bnppcHBpbmcgb2YgdGhlIHRlc3QgcHJvamVjdHMgKi8NCi0JcHVibGljIHZvaWQgdW56aXBUZXN0UHJvamVjdHMoZmluYWwgSW5wdXRTdHJlYW0gYXJjaGl2ZVN0cmVhbSwgZmluYWwgU3RyaW5nIGFyY2hpdmVOYW1lLCBmaW5hbCBGaWxlIGRlc3REaXIpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotDQotCQlpZiAoYXJjaGl2ZVN0cmVhbSA9PSBudWxsKQ0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhlIGFyY2hpdmUgcmVzb3VyY2Ugc3RyZWFtIGlzIG5vdCBpbml0aWFsaXplZCEgYXJjaGl2ZTogIiArIGFyY2hpdmVOYW1lICsgIiAtIGRpcjogIiArIGRlc3REaXIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJdW56aXBBcmNoaXZlVG9EaXIoYXJjaGl2ZVN0cmVhbSwgYXJjaGl2ZU5hbWUsIGRlc3REaXIpOw0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJYXJjaGl2ZVN0cmVhbS5jbG9zZSgpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBVbnppcHMgdGhlIGNvbnRlbnQgb2YgPHR0PnppcEZpbGVMb2NhdGlvbjwvdHQ+IGludG8gPHR0Pm91dEZvbGRlcjwvdHQ+Lg0KLQkgKiANCi0JICogQHBhcmFtIHppcEZpbGVMb2NhdGlvbg0KLQkgKiBAcGFyYW0gb3V0Rm9sZGVyDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRaaXBwZWRDb250ZW50KEZpbGUgemlwRmlsZUxvY2F0aW9uLCBGaWxlIG91dEZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGVMb2NhdGlvbik7DQotCQlhZGRaaXBwZWRDb250ZW50KGZpcywgb3V0Rm9sZGVyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVW56aXBzIHRoZSBjb250ZW50IG9mIDx0dD5pczwvdHQ+IGludG8gPHR0Pm91dEZvbGRlcjwvdHQ+Lg0KLQkgKiANCi0JICogQHBhcmFtIHppcEZpbGVMb2NhdGlvbg0KLQkgKiBAcGFyYW0gb3V0Rm9sZGVyDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRaaXBwZWRDb250ZW50KElucHV0U3RyZWFtIGlzLCBGaWxlIG91dEZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCVppcElucHV0U3RyZWFtIHppcyA9IG5ldyBaaXBJbnB1dFN0cmVhbShpcyk7DQotCQlaaXBFbnRyeSBlbnRyeSA9IG51bGw7DQotCQl3aGlsZSAoKGVudHJ5ID0gemlzLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKQ0KLQkJew0KLQkJCUZpbGUgb3V0RmlsZSA9IG5ldyBGaWxlKG91dEZvbGRlciwgZW50cnkuZ2V0TmFtZSgpKTsNCi0NCi0JCQlpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkNCi0JCQl7DQotCQkJCW91dEZpbGUubWtkaXJzKCk7DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSk7DQotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMjA0OF07DQotCQkJCWludCByZWFkOw0KLQkJCQl3aGlsZSAoKHJlYWQgPSB6aXMucmVhZChidWZmKSkgPiAwKQ0KLQkJCQl7DQotCQkJCQlvdXQud3JpdGUoYnVmZiwgMCwgcmVhZCk7DQotCQkJCX0NCi0JCQkJb3V0LmNsb3NlKCk7DQotCQkJfQ0KLQ0KLQkJCXppcy5jbG9zZUVudHJ5KCk7DQotCQl9DQotDQotCQl6aXMuY2xvc2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRGVsZXRlcyBkaXJlY3Rvcnkgd2l0aCBpdHMgY29udGVudA0KLQkgKiANCi0JICogQHBhcmFtIGRpcg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcikNCi0Jew0KLQkJaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSBkaXJlY3RvcnkiICsgZGlyLmdldE5hbWUoKSk7DQotCQl9DQotDQotCQlmb3IgKFN0cmluZyBzIDogZGlyLmxpc3QoKSkNCi0JCXsNCi0JCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIHMpOw0KLQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpDQotCQkJew0KLQkJCQlkZWxldGVEaXJlY3RvcnkoZik7DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQlmLmRlbGV0ZSgpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWRpci5kZWxldGUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgZGlyZWN0b3J5IG5hbWVkIHZpYSB0aGUgcGF0dGVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikgKyBGaWxlLnNlcGFyYXRvciArIGRpck5hbWUNCi0JICogDQotCSAqIEBwYXJhbSBkaXJOYW1lDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRGlyZWN0b3J5KFN0cmluZyBkaXJOYW1lKQ0KLQl7DQotCQlGaWxlIHRlbXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksIGRpck5hbWUpOw0KLQkJaWYgKHRlbXBEaXIuZXhpc3RzKCkpDQotCQl7DQotCQkJZGVsZXRlRGlyZWN0b3J5KHRlbXBEaXIpOw0KLQkJfQ0KLQ0KLQkJaWYgKCF0ZW1wRGlyLm1rZGlyKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVtcCBkaXJlY29yeSAiICsgdGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIgY291bGQgbm90IGJlIGNyZWF0ZWQiKTsNCi0JCX0NCi0JCS8vIHRlbXBEaXIuZGVsZXRlT25FeGl0KCk7DQotDQotCQlyZXR1cm4gdGVtcERpcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29weSB0aGUgY29udGVudCBvZiA8Y29kZT5maWxlUGF0aDwvY29kZT4gYW5kIGNvcGllcyBpdCB0byB0ZW1wb3JhcnkgZmlsZSBpbiBzeXN0ZW0gdGVtcCBkaXJlY3RvcnkuDQotCSAqIA0KLQkgKiBAcGFyYW0gY2xhc3NDb250ZXh0DQotCSAqIEBwYXJhbSBmaWxlUGF0aA0KLQkgKiBAcmV0dXJuIGNyZWF0ZWQgdGVtcG9yYXJ5IGZpbGUNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvcHlUb1RlbXBMb2NhdGlvbihDbGFzczw/PiBjbGFzc0NvbnRleHQsIFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElucHV0U3RyZWFtIGlzID0gY2xhc3NDb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0oZmlsZVBhdGgpOw0KLQkJZmluYWwgRmlsZSBkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOw0KLQkJZmluYWwgRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKGRpciwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmphdmEiKTsNCi0JCXRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOw0KLQ0KLQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7DQotCQl0cnkNCi0JCXsNCi0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzEwMjRdOw0KLQkJCWZvciAoaW50IGNudCA9IDA7IChjbnQgPSBpcy5yZWFkKGJ1ZmYpKSA+IC0xOykNCi0JCQl7DQotCQkJCWZvcy53cml0ZShidWZmLCAwLCBjbnQpOw0KLQkJCX0NCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCWlzLmNsb3NlKCk7DQotCQkJZm9zLmNsb3NlKCk7DQotCQl9DQotDQotCQlyZXR1cm4gdGVtcEZpbGU7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpbGVDb250ZW50KEZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoZmlsZSk7DQotCQl0cnkNCi0JCXsNCi0JCQlmdy53cml0ZShjb250ZW50KTsNCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCWZ3LmNsb3NlKCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9maWxlcy9VbnppcHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9maWxlcy9VbnppcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOWJmZGZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvZmlsZXMvVW56aXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuZmlsZXM7DQotDQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7DQotDQotLyoqDQotICogQSBzaW1wbGUgdXRpbGl0eSBmb3IgdW56aXBwaW5nIFpJUCBhcmNoaXZlcw0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGNsYXNzIFVuemlwcGVyIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVbnppcHBlciBJTlNUQU5DRSA9IG5ldyBVbnppcHBlcigpOw0KLQ0KLQkvLyBIaWRlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JcHJpdmF0ZSBVbnppcHBlcigpIHsNCi0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29weSB0aGUgY29udGVudCBmcm9tIHRoZSA8Y29kZT5zb3VyY2VTdHJlYW08L2NvZGU+IHRvIHRoZQ0KLQkgKiA8Y29kZT5kZXN0aW5hdGlvblN0cmVhbTwvY29kZT4NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VTdHJlYW0NCi0JICogQHBhcmFtIGRlc3RTdHJlYW0NCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgY29weUlucHV0U3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIHNvdXJjZVN0cmVhbSwNCi0JCQlmaW5hbCBPdXRwdXRTdHJlYW0gZGVzdFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsNCi0JCWludCBsZW47DQotDQotCQl3aGlsZSAoKGxlbiA9IHNvdXJjZVN0cmVhbS5yZWFkKGJ1ZmZlcikpID49IDApIHsNCi0JCQlkZXN0U3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsNCi0JCX0NCi0NCi0JCWRlc3RTdHJlYW0uZmx1c2goKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVW56aXAgdGhlIHppcCBmaWxlIHNwZWNpZmllZCB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5DQotCSAqIA0KLQkgKiBAcGFyYW0gc291cmNlRmlsZQ0KLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgemlwIGZpbGUNCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uRGlyDQotCSAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQ0KLQkgKiBAcGFyYW0gdG9Mb3dlckNhc2UNCi0JICogICAgICAgICAgICBpZiB0cnVlLCBhbGwgdGhlIHVuemlwcGVkIGVudHJpZXMgd291bGQgYmUgbG93ZXJjYXNlZCAoZm9yICpJWA0KLQkgKiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkpIFRoZSBiYWNrZ3JvdW5kIGJlaGluZCB0aGlzIHBhcmFtZXRlciBpcyB0aGUNCi0JICogICAgICAgICAgICBjYXNlIGluY29uc2lzdGVuY3kgYmV0d2VlbiBBQkFQIHhtbCB0ZXN0IGRhdGEgZGlyZWN0b3J5IG5hbWVzDQotCSAqICAgICAgICAgICAgYW5kIHRoZSByZWFsIGRpcmVjdG9yeSBuYW1lcyBpbiB0aGUgQUJBUCBaSVANCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gYW55IG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGlzIG51bGwNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiA8Y29kZT5zb3VyY2VGaWxlPC9jb2RlPiBkb2VzIG5vdCBleGlzdCBvciBwb2ludHMgdG8gYQ0KLQkgKiAgICAgICAgICAgICBkaXJlY3RvcnkNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiA8Y29kZT5kZXN0aW5hdGlvbkRpcjwvY29kZT4gZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGENCi0JICogICAgICAgICAgICAgZGlyZWN0b3J5DQotCSAqLw0KLQlwdWJsaWMgdm9pZCB1bnppcChmaW5hbCBGaWxlIHNvdXJjZUZpbGUsIGZpbmFsIEZpbGUgZGVzdGluYXRpb25EaXIsDQotCQkJZmluYWwgYm9vbGVhbiB0b0xvd2VyQ2FzZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWNoZWNrSW5wdXRQYXJhbXMoc291cmNlRmlsZSwgZGVzdGluYXRpb25EaXIpOw0KLQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsNCi0NCi0JCXRyeSB7DQotCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHNvdXJjZUZpbGUpOw0KLQkJCUVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOw0KLQ0KLQkJCS8vIENyZWF0ZSBkaXIgc3RydWN0dXJlDQotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0JCQkJZmluYWwgWmlwRW50cnkgZW50cnkgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotDQotCQkJCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCQkvLyBUaGlzIGlzIG5vdCByb2J1c3QsIGp1c3QgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMuDQotCQkJCQkobmV3IEZpbGUoZGVzdGluYXRpb25EaXIsIHRvTG93ZXJDYXNlID8gZW50cnkuZ2V0TmFtZSgpDQotCQkJCQkJCS50b0xvd2VyQ2FzZSgpIDogZW50cnkuZ2V0TmFtZSgpKSkubWtkaXJzKCk7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gQ3JlYXRlIGZpbGVzDQotCQkJZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOw0KLQkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7DQotCQkJCWZpbmFsIFppcEVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOw0KLQ0KLQkJCQlpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0NCi0JCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOw0KLQkJCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBidWZPdXRTdHJlYW0gPSBudWxsOw0KLQ0KLQkJCQl0cnkgew0KLQkJCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGVzdGluYXRpb25EaXIsDQotCQkJCQkJCXRvTG93ZXJDYXNlID8gZW50cnkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgOiBlbnRyeQ0KLQkJCQkJCQkJCS5nZXROYW1lKCkpKTsNCi0JCQkJCWJ1Zk91dFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmb3MpOw0KLQkJCQkJY29weUlucHV0U3RyZWFtKHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpLCBidWZPdXRTdHJlYW0pOw0KLQkJCQkJZm9zLmZsdXNoKCk7DQotCQkJCQlidWZPdXRTdHJlYW0uZmx1c2goKTsNCi0JCQkJfSBmaW5hbGx5IHsNCi0JCQkJCWlmIChmb3MgIT0gbnVsbCkgew0KLQkJCQkJCWZvcy5jbG9zZSgpOw0KLQkJCQkJfQ0KLQkJCQkJaWYgKGJ1Zk91dFN0cmVhbSAhPSBudWxsKSB7DQotCQkJCQkJYnVmT3V0U3RyZWFtLmNsb3NlKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmICh6aXBGaWxlICE9IG51bGwpIHsNCi0JCQkJemlwRmlsZS5jbG9zZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tJbnB1dFBhcmFtcyhmaW5hbCBGaWxlIHppcEZpbGUsIGZpbmFsIEZpbGUgZGVzdGluYXRpb24pIHsNCi0JCS8vIENvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbSh6aXBGaWxlLCAiemlwRmlsZSIpOw0KLQkJLy8gQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGRlc3RpbmF0aW9uLCAiZGVzdGluYXRpb24iKTsNCi0JCWlmICghemlwRmlsZS5leGlzdHMoKSB8fCB6aXBGaWxlLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJIlpJUCBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlzIGEgZGlyZWN0b3J5Iik7DQotCQl9DQotCQlpZiAoIWRlc3RpbmF0aW9uLmV4aXN0cygpIHx8ICFkZXN0aW5hdGlvbi5pc0RpcmVjdG9yeSgpKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJCSJEZXN0aW5hdGlvbiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiKTsNCi0JCX0NCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL0Fic3RyYWN0RHluYW1pY01vY2suamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svQWJzdHJhY3REeW5hbWljTW9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTMxNGIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svQWJzdHJhY3REeW5hbWljTW9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrOw0KLQ0KLWltcG9ydCBvcmcuam1vY2suY29yZS5JbnZvY2F0aW9uRGlzcGF0Y2hlcjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGlzIGVxdWl2YWxlbnQgdG8gPGM+b3JnLmptb2NrLmNvcmUuQWJzdHJhY3REeW5hbWljTW9jazwvYz4uIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBjbGFzcyBpcyBwYXJhbWV0ZXJpemVkLiBJdCBleHRlbmRzIGZyb20NCi0gKiA8Yz5vcmcuam1vY2suY29yZS5BYnN0cmFjdER5bmFtaWNNb2NrPC9jPiBhbmQgaXMgdGh1cyBiYWNrd2FyZCBjb21wYXRpYmxlLg0KLSAqIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICogDQotICogQHBhcmFtIDxUPg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdER5bmFtaWNNb2NrPFQ+IGV4dGVuZHMgb3JnLmptb2NrLmNvcmUuQWJzdHJhY3REeW5hbWljTW9jaw0KLXsNCi0NCi0JcHVibGljIEFic3RyYWN0RHluYW1pY01vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSwgU3RyaW5nIG5hbWUsIEludm9jYXRpb25EaXNwYXRjaGVyIGludm9jYXRpb25EaXNwYXRjaGVyKQ0KLQl7DQotCQlzdXBlcihtb2NrZWRUeXBlLCBuYW1lLCBpbnZvY2F0aW9uRGlzcGF0Y2hlcik7DQotCX0NCi0NCi0JcHVibGljIEFic3RyYWN0RHluYW1pY01vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSwgU3RyaW5nIG5hbWUpDQotCXsNCi0JCXN1cGVyKG1vY2tlZFR5cGUsIG5hbWUpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIENsYXNzPFQ+IGdldE1vY2tlZFR5cGUoKQ0KLQl7DQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9ja2VkVHlwZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYWJzdHJhY3QgVCBwcm94eSgpOw0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL0Fic3RyYWN0TW9ja09iamVjdFRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL0Fic3RyYWN0TW9ja09iamVjdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1YzEzNjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9BYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jazsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkNvbnN0cmFpbnQ7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkR5bmFtaWNNb2NrOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5Gb3JtYXR0aW5nOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5JbnZvY2F0aW9uTWF0Y2hlcjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuTW9ja09iamVjdFN1cHBvcnRUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUubWF0Y2hlci5JbnZva2VBdExlYXN0T25jZU1hdGNoZXI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLm1hdGNoZXIuSW52b2tlQXRNb3N0T25jZU1hdGNoZXI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLm1hdGNoZXIuSW52b2tlQ291bnRNYXRjaGVyOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5tYXRjaGVyLkludm9rZU9uY2VNYXRjaGVyOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5tYXRjaGVyLlRlc3RGYWlsdXJlTWF0Y2hlcjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5SZXR1cm5JdGVyYXRvclN0dWI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLnN0dWIuUmV0dXJuU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5UaHJvd1N0dWI7DQotDQotLyoqDQotICogQW4gYWJzdHJhY3QgY2xhc3MgZnJvbSB3aGljaCBzdWItY2xhc3NpbmcgdGVzdCBjYXNlcyBjYW4gaW5oZXJpdC4gVGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIG9yZy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2Ugd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0DQotICogaWQgZG9lcyBub3QgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0byA8Yz5uZXdDb3JlTW9jazwvYz4gbWV0aG9kIGFuZCB0aHVzIGlzIG5vdCBhYmxlIHRvIGNyZWF0ZSBhbnkgcHJveGllcy4gVGhlIG90aGVyIG1ham9yIGRpZmZlcmVuY2UgaXMgdGhhdA0KLSAqIHRoaXMgY2xhc3MgaXMgcGFyYW1ldGVyaXplZC4gSXQgc2hvdWxkIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBzdWItY2xhc3NlcyB0aGF0IHByb3ZpZGUgc3Ryb25nbHkgdHlwZWQgbW9ja3MuIFRoaXMgY2xhc3MgYWxzbyB0YWtlIGFkdmFudGFnZSBvZg0KLSAqIHNvbWUgb2YgdGhlIGphdmEgNSBzdWdhcnMuIEZvciBleGFtcGxlICJ2YXJhcmdzIi4NCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZSBleHRlbmRzIE1vY2tPYmplY3RTdXBwb3J0VGVzdENhc2UNCi17DQotDQotCXB1YmxpYyBBYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZSgpDQotCXsNCi0JfQ0KLQ0KLQlwdWJsaWMgQWJzdHJhY3RNb2NrT2JqZWN0VGVzdENhc2UoU3RyaW5nIG5hbWUpDQotCXsNCi0JCXN1cGVyKG5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbW9jayBvYmplY3QgdGhhdCBtb2NrcyB0aGUgZ2l2ZW4gdHlwZS4gVGhlIG1vY2sgb2JqZWN0IGlzIG5hbWVkIGFmdGVyIHRoZSB0eXBlOyB0aGUgZXhhY3QgbmFtZSBpcyBjYWxjdWxhdGVkIGJ5DQotCSAqIHtAbGluayAjZGVmYXVsdE1vY2tOYW1lRm9yVHlwZX0uDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9ja2VkVHlwZQ0KLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIHRvIGJlIG1vY2tlZC4NCi0JICogQHJldHVybiBBIHtAbGluayBNb2NrfSBvYmplY3QgdGhhdCBtb2NrcyA8dmFyPm1vY2tlZFR5cGU8L3Zhcj4uDQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIDxUPiBNb2NrPFQ+IG1vY2soQ2xhc3MgbW9ja2VkVHlwZSkNCi0Jew0KLQkJcmV0dXJuIG1vY2sobW9ja2VkVHlwZSwgZGVmYXVsdE1vY2tOYW1lRm9yVHlwZShtb2NrZWRUeXBlKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBtb2NrIG9iamVjdCB0aGF0IG1vY2tzIHRoZSBnaXZlbiB0eXBlIGFuZCBpcyBleHBsaWNpdGx5IGdpdmVuIGEgbmFtZS4gVGhlIG1vY2sgb2JqZWN0IGlzIG5hbWVkIGFmdGVyIHRoZSB0eXBlOyB0aGUgZXhhY3QgbmFtZSBpcw0KLQkgKiBjYWxjdWxhdGVkIGJ5IHtAbGluayAjZGVmYXVsdE1vY2tOYW1lRm9yVHlwZX0uDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9ja2VkVHlwZQ0KLQkgKiAgICAgICAgICAgIFRoZSB0eXBlIHRvIGJlIG1vY2tlZC4NCi0JICogQHBhcmFtIHJvbGVOYW1lDQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIG1vY2sgb2JqZWN0DQotCSAqIEByZXR1cm4gQSB7QGxpbmsgTW9ja30gb2JqZWN0IHRoYXQgbW9ja3MgPHZhcj5tb2NrZWRUeXBlPC92YXI+Lg0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyA8VD4gTW9jazxUPiBtb2NrKENsYXNzIG1vY2tlZFR5cGUsIFN0cmluZyByb2xlTmFtZSkNCi0Jew0KLQkJZmluYWwgTW9jazxUPiBuZXdNb2NrID0gbmV3IE1vY2s8VD4obmV3Q29yZU1vY2sobW9ja2VkVHlwZSwgcm9sZU5hbWUpKTsNCi0JCXJlZ2lzdGVyVG9WZXJpZnkobmV3TW9jayk7DQotCQlyZXR1cm4gbmV3TW9jazsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgPFQ+IER5bmFtaWNNb2NrIG5ld0NvcmVNb2NrKENsYXNzPFQ+IG1vY2tlZFR5cGUsIFN0cmluZyByb2xlTmFtZSk7DQotDQotCS8qKg0KLQkgKiBDYWxjdWxhdGVzDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9ja2VkVHlwZQ0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRNb2NrTmFtZUZvclR5cGUoQ2xhc3M8Pz4gbW9ja2VkVHlwZSkNCi0Jew0KLQkJcmV0dXJuICJtb2NrIiArIEZvcm1hdHRpbmcuY2xhc3NTaG9ydE5hbWUobW9ja2VkVHlwZSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoT2JqZWN0IG8pDQotCXsNCi0JCXJldHVybiBuZXcgUmV0dXJuU3R1YihvKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShib29sZWFuIHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBCb29sZWFuKHJlc3VsdCkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHJldHVyblZhbHVlKGJ5dGUgcmVzdWx0KQ0KLQl7DQotCQlyZXR1cm4gcmV0dXJuVmFsdWUobmV3IEJ5dGUocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoY2hhciByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgQ2hhcmFjdGVyKHJlc3VsdCkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHJldHVyblZhbHVlKHNob3J0IHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBTaG9ydChyZXN1bHQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShpbnQgcmVzdWx0KQ0KLQl7DQotCQlyZXR1cm4gcmV0dXJuVmFsdWUobmV3IEludGVnZXIocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUobG9uZyByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgTG9uZyhyZXN1bHQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShmbG9hdCByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgRmxvYXQocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoZG91YmxlIHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBEb3VibGUocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuSXRlcmF0b3IoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFJldHVybkl0ZXJhdG9yU3R1Yihjb2xsZWN0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5JdGVyYXRvcihPYmplY3RbXSBhcnJheSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBSZXR1cm5JdGVyYXRvclN0dWIoYXJyYXkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHRocm93RXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpDQotCXsNCi0JCXJldHVybiBuZXcgVGhyb3dTdHViKHRocm93YWJsZSk7DQotCX0NCi0NCi0JcHVibGljIEludm9jYXRpb25NYXRjaGVyIG9uY2UoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEludm9rZU9uY2VNYXRjaGVyKCk7DQotCX0NCi0NCi0JcHVibGljIEludm9jYXRpb25NYXRjaGVyIGF0TGVhc3RPbmNlKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBJbnZva2VBdExlYXN0T25jZU1hdGNoZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW52b2NhdGlvbk1hdGNoZXIgYXRNb3N0T25jZSgpDQotCXsNCi0JCXJldHVybiBuZXcgSW52b2tlQXRNb3N0T25jZU1hdGNoZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW52b2NhdGlvbk1hdGNoZXIgZXhhY3RseShpbnQgZXhwZWN0ZWRDb3VudCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBJbnZva2VDb3VudE1hdGNoZXIoZXhwZWN0ZWRDb3VudCk7DQotCX0NCi0NCi0JcHVibGljIEludm9jYXRpb25NYXRjaGVyIG5ldmVyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBUZXN0RmFpbHVyZU1hdGNoZXIoIm5vdCBleHBlY3RlZCIpOw0KLQl9DQotDQotCXB1YmxpYyBJbnZvY2F0aW9uTWF0Y2hlciBuZXZlcihTdHJpbmcgZXJyb3JNZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFRlc3RGYWlsdXJlTWF0Y2hlcigibm90IGV4cGVjdGVkICgiICsgZXJyb3JNZXNzYWdlICsgIikiKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNpbmNlIDEuMC4xDQotCSAqLw0KLQlwdWJsaWMgU3R1YiBvbkNvbnNlY3V0aXZlQ2FsbHMoU3R1Yi4uLiBzdHVicykNCi0Jew0KLQkJcmV0dXJuIG9uQ29uc2VjdXRpdmVDYWxscyhzdHVicyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzaW5jZSAxLjEuMA0KLQkgKi8NCi0JcHVibGljIFN0dWIgZG9BbGwoU3R1Yi4uLiBzdHVicykNCi0Jew0KLQkJcmV0dXJuIGRvQWxsKHN0dWJzKTsNCi0JfQ0KLQkNCi0JcHVibGljIENvbnN0cmFpbnQgY29sbGVjdGlvbldpdGhFbGVtZW50cyhmaW5hbCBpbnQgZXhwZWN0ZWRDb2xsZWN0aW9uU2l6ZSwgZmluYWwgT2JqZWN0Li4uIG9iamVjdHMpDQotCXsNCi0JCXJldHVybiBuZXcgQ29uc3RyYWludCgpew0KLQ0KLQkJCXB1YmxpYyBib29sZWFuIGV2YWwoT2JqZWN0IGFyZzApDQotCQkJew0KLQkJCQlmaW5hbCBDb2xsZWN0aW9uPD8+IGNvbCA9IChDb2xsZWN0aW9uPD8+KWFyZzA7DQotCQkJCWZvcihPYmplY3QgbyA6IG9iamVjdHMpDQotCQkJCXsNCi0JCQkJCWlmKCFjb2wuY29udGFpbnMobykpDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlyZXR1cm4gb2JqZWN0cy5sZW5ndGggPT0gZXhwZWN0ZWRDb2xsZWN0aW9uU2l6ZTsNCi0JCQl9DQotDQotCQkJcHVibGljIFN0cmluZ0J1ZmZlciBkZXNjcmliZVRvKFN0cmluZ0J1ZmZlciBhcmcwKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFyZzA7DQotCQkJfX07DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9Nb2NrLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL01vY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2MzYjlhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL01vY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jazsNCi0NCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuRHluYW1pY01vY2s7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIDxjPm9yZy5qbW9jay5Nb2NrPC9jPiBjbGFzcyBmcm9tIEpNb2NrLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBhIHBhcmFtZXRlcml6ZWQgKGdlbmVyaWMpIHZlcnNpb24uIFRoaXMgbWFrZXMNCi0gKiBpdCBhIGxvdCBlYXNpZXIgZm9yIHVzZSBhcyBubyBtYW51YWwgY2FzdHMgdG8gdGhlIG1vY2tlZCB0eXBlIGFyZSByZXF1aXJlZCBieSB0aGUgcHJvZ3JhbW1lci4gVGhpcyBjbGFzcyBleHRlbmRzIGZyb20gPGM+b3JnLmptb2NrLk1vY2s8L2M+IHNvIGl0cw0KLSAqIGZ1bGx5IGJhY2t3YXJkIGNvbXBhdGlibGUuDQotICogDQotICogQHNlZSBvcmcuam1vY2suTW9jaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNb2NrPFQ+IGV4dGVuZHMgb3JnLmptb2NrLk1vY2sNCi17DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IG1vY2sgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4gVGhlIG5ldyBtb2NrIGhhcyB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoaXMgbmFtZSB3aWxsIGJlIHNob3duIGJ5IGFsbCByZXBvcnRzIGNvbmNlcm5pbmcgdGhpcyBtb2NrDQotCSAqIGluc3RhbmNlLiBTdWNoIHJlcG9ydHMgYXJlIHVubWFjaGVkIGludm9jYXRpb25zIGFuZCBzbyBvbi4NCi0JICogDQotCSAqIEBwYXJhbSBtb2NrZWRUeXBlIC0NCi0JICogICAgICAgICAgICB0aGUgdHlwZSB0byBiZSBtb2NrZWQuIFRoaXMgY291bGQgYmUgZWl0aGVyIGNsYXNzIG9yIGludGVyZmFjZS4NCi0JICogQHBhcmFtIG5hbWUgLQ0KLQkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhpcyBtb2NrDQotCSAqLw0KLQlwdWJsaWMgTW9jayhDbGFzczxUPiBtb2NrZWRUeXBlLCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJc3VwZXIobW9ja2VkVHlwZSwgbmFtZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBuZXcgbW9jayBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLg0KLQkgKiANCi0JICogQHBhcmFtIG1vY2tlZFR5cGUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIHRvIGJlIG1vY2tlZC4gVGhpcyBjbGFzcyBuZWVkcyB0byBiZSBlaXRoZXIgY2xhc3Mgb3IgaW50ZXJmYWNlLg0KLQkgKi8NCi0JcHVibGljIE1vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSkNCi0Jew0KLQkJc3VwZXIobW9ja2VkVHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgbmV3IE1vY2sgdGhhdCB3cmFwcyB0aGUgc3VwcGxpZWQgPGM+RHluYW1pY01vY2s8L2M+IGluc3RhbmNlLg0KLQkgKiANCi0JICogQHBhcmFtIGFyZzAgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBkeW5hbWljIG1vY2sgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBNb2NrKER5bmFtaWNNb2NrIGFyZzApDQotCXsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBPYnRhaW5zIHRoZSBwcm94eSBpbnN0YW5jZSBmb3IgdGhpcyBtb2NrLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgcHJveHkgaW5zdGFuY2UgZm9yIHRoaXMgbW9jay4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIFQgcHJveHkoKQ0KLQl7DQotCQlyZXR1cm4gKFQpIHN1cGVyLnByb3h5KCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9Nb2NrT2JqZWN0VGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svTW9ja09iamVjdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxMjYwNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9Nb2NrT2JqZWN0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2s7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLnRlc3RjYXNlcy5CZWZvcmVBZnRlckVuYWJsZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzLklCZWZvcmVBZnRlckVuYWJsZWQ7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkNvcmVNb2NrOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5EeW5hbWljTW9jazsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuVmVyaWZpYWJsZTsNCi0NCi0NCi0vKioNCi0gKiBBbiB0ZXN0IGNhc2UgYmFzZSBjbGFzcyBmb3IgbW9jayBvYmplY3RzIHRlc3QgY2FzZS4gVGhpcyBvbmUgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIG9yZy5qbW9jay5jZ2xpYi5Nb2NrT2JqZWN0VGVzdENhc2UuIFRoZXJlIGFyZSBzZXZlcmFsDQotICogaW1wb3J0YW50IGRpZmZlcmVuY2VzIHRob3VnaC4gVGhpcyB0ZXN0IGNhc2UgY2xhc3MgYXNzdW1lcyB0aGF0IHRoZSBsb2FkZXIgb2YgdGhlIHRlc3QgY2FzZSBjbGFzcyBpcyBhYmxlIHRvIGxvYWQgYm90aCB0aGUgY2xhc3MgYmVpbmcgbW9ja2VkIGFuZA0KLSAqIHRoZSBqbW9jayBjbGFzc2VzLiBUaHVzIHRlc3QgY2FzZSBjbGFzcyBsb2FkZXIgaXMgdXNlZCB0byBjcmVhdGUgdGhlIG1vY2sgdHlwZS4gVGhpcyBtb2NrIHRlc3QgY2FzZSBhbHNvIHByb3ZpZGVzIHR3byBuZXcgPGM+bW9jazwvYz4gbWV0aG9kcy4NCi0gKiBUaGVzZSBtZXRob2RzIGNhbiBpbnN0YW50aWF0ZSBhIG1vY2sgZm9yIGEgZ2l2ZW4gY2xhc3MgYnkgZXhlY3V0aW5nIHRoZSBjbGFzcydzIGNvbnN0cnVjdG9yLiBUaGUgbWV0aG9kcyA8Yz48L2M+IGFuZCA8Yz48L2M+IGluaGVyaXRlZCBmcm9tDQotICogPGM+QWJzdHJhY3RNb2NrT2JqZWN0VGVzdENhc2U8L2M+IGNyZWF0ZSBtb2NrcyB3aXRob3V0IGV4ZWN1dGluZyB0aGUgY29uc3RydWN0b3Igb2YgdGhlIG1vY2tlZCBjbGFzcy4gVGhleSB1c2UgdGhlIFNVTidzIHJlZmxlY3Rpb24gbWVjaGFuaXNtIGFuZA0KLSAqIGFyZSBhYmxlIHRvIGNyZWF0ZSBjbGFzc2VzIHdpdGhvdXQgYSB2aXNpYmxlIGRlZmF1bHQgY29uc3RydWN0b3Igb3Igd2l0aG91dCBjb25zdHJ1Y3RvciBhdCBhbGwuIFRoaXMgZnVuY3Rpb25hbGxpdHkgaG93ZXZlciBpcyBwbGF0Zm9ybSBzcGVjaWZpYy4NCi0gKiBJdCBjYW4gYmUgY29tcGlsZWQgYW5kIGV4ZWN1dGVkIG9ubHkgb24gU1VOIFZNcy4gU2hvdWxkIHRoZSBjb2RlIGJlIGV4ZWN1dGVkIG9uIGFub3RoZXIgVk0gbW9zdCBsaWtlbHkgYSA8Yz5Ob0NsYXNzRGVmRm91bmRFcnJvcjwvYz4gd2lsbCBvY3Vyci4NCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2NrT2JqZWN0VGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZSBpbXBsZW1lbnRzIElCZWZvcmVBZnRlckVuYWJsZWQNCi17DQotCXByaXZhdGUgZmluYWwgQmVmb3JlQWZ0ZXJFbmFibGVyIGJhZSA9IG5ldyBCZWZvcmVBZnRlckVuYWJsZXIodGhpcyk7DQotCXB1YmxpYyB2b2lkIGFmdGVyVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBiZWZvcmVUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHJ1bkJhcmVJbnRlcm5hbCgpIHRocm93cyBUaHJvd2FibGUNCi0Jew0KLQkJc3VwZXIucnVuQmFyZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBydW5CYXJlKCkgdGhyb3dzIFRocm93YWJsZQ0KLQl7DQotCQliYWUucnVuQmFyZSgpOw0KLQl9DQotCQ0KLQlwcml2YXRlIExpc3Q8TW9jazw/Pj4gbW9ja3NUb1ZlcmlmeSA9IG5ldyBWZWN0b3I8TW9jazw/Pj4oKTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGM+TW9ja09iamVjdFRlc3RDYXNlPC9jPiBpbnN0YW5jZSB3aXRoIG5vIG5hbWUNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgTW9ja09iamVjdFRlc3RDYXNlKCkNCi0Jew0KLQl9DQotDQotCXB1YmxpYyBMaXN0PE1vY2s8Pz4+IGdldE1vY2tzVG9WZXJpZnkoKQ0KLQl7DQotCQlmaW5hbCBMaXN0PE1vY2s8Pz4+IGNvcHkgPSBuZXcgQXJyYXlMaXN0PE1vY2s8Pz4+KCk7DQotCQljb3B5LmFkZEFsbChtb2Nrc1RvVmVyaWZ5KTsNCi0JCXJldHVybiBjb3B5Ow0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyVG9WZXJpZnkoVmVyaWZpYWJsZSBhcmcwKQ0KLQl7DQotCQltb2Nrc1RvVmVyaWZ5LnJlbW92ZShhcmcwKTsNCi0JCXN1cGVyLnVucmVnaXN0ZXJUb1ZlcmlmeShhcmcwKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdmVyaWZ5KCkNCi0Jew0KLQkJbW9ja3NUb1ZlcmlmeS5jbGVhcigpOw0KLQkJc3VwZXIudmVyaWZ5KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBuZXcgPGM+TW9ja09iamVjdFRlc3RDYXNlPC9jPiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQ0KLQkgKiANCi0JICogQHBhcmFtIG5hbWUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMgdGVzdCBjYXNlLg0KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZQ0KLQkgKi8NCi0JcHVibGljIE1vY2tPYmplY3RUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0Jew0KLQkJc3VwZXIobmFtZSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCA8VD4gRHluYW1pY01vY2sgbmV3Q29yZU1vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSwgU3RyaW5nIHJvbGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gbmV3IENvcmVNb2NrKG1vY2tlZFR5cGUsIHJvbGVOYW1lKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL1N0dWJVdGlscy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9TdHViVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTVhYzg3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL1N0dWJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jazsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLlN0dWI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLnN0dWIuUmV0dXJuU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5TdHViU2VxdWVuY2U7DQotDQotLyoqDQotICogVXRpbHMgZm9yIGNyZWF0aW5nIG1vcmUgY29tcGxleCBqbW9jayBzdHVicw0KLSAqIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICogDQotICovDQotcHVibGljIGNsYXNzIFN0dWJVdGlscw0KLXsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBzdHViIHRoYXQgd2lsbCByZXR1cm4gdGhlIHByb3h5IGZvciB0aGUgbmV4dCBtb2NrIGluIHRoZSBzdXBwbGllZCBhcnJheSBvbiBhIGNvbnNlcXV0aXZlIGNhbGwuIEkuZS4gdGhlIGZpcnN0IGNhbGwgcmV0dXJucyB0aGUgcHJveHkNCi0JICogYXQgPGM+cmV0dXJuVmFsdWVzWzBdPC9jPiwgdGhlIHNlY29uZCBjYWxsIHdpbGwgcmV0dXJuIHRoZSBwcm94eSBmb3IgdGhlIG1vY2sgYXQgPGM+cmV0dXJuVmFsdWVzWzFdPC9jPiwgYW5kIHNvIGZvcnRoDQotCSAqIA0KLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWVzIC0NCi0JICogICAgICAgICAgICB0aGUgbW9ja3Mgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBvbiBjb25zZXF1dGl2ZSBjYWxscw0KLQkgKiBAcmV0dXJuIC0gYSBzdHViIHRoYXQgd2lsbCByZXR1cm4gdGhlIHByb3hpZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9ja3Mgb24gZWFjaCBjb25zZXF1dGl2ZSBjYWxsDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0dWIgb25Db25zZXF1dGl2ZUNhbGxzV2lsbFJldHVybk1vY2tzKE1vY2s8Pz5bXSByZXR1cm5WYWx1ZXMpDQotCXsNCi0JCWZpbmFsIFN0dWJbXSByZXR1cm5TdHVicyA9IG5ldyBTdHViW3JldHVyblZhbHVlcy5sZW5ndGhdOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXR1cm5WYWx1ZXMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJcmV0dXJuU3R1YnNbaV0gPSBuZXcgUmV0dXJuU3R1YihyZXR1cm5WYWx1ZXNbaV0ucHJveHkoKSk7DQotCQl9DQotCQlyZXR1cm4gbmV3IFN0dWJTZXF1ZW5jZShyZXR1cm5TdHVicyk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDb252ZXJ0cyBhbiBhcnJheSBvZiBtb2NrcyB0byBhbiBhcnJheSBvZiBwcm94aWVzIGZvciB0aGVzZSBtb2Nrcy4gQWxsIG1vY2tzIHNob3VsZCBiZSBtb2NrcyBmb3Igb25lIGFuZCB0aGUNCi0JICogc2FtZSB0eXBlLg0KLQkgKiBAcGFyYW0gPFQ+IC0gdGhlIHR5cGUgb2YgdGhlIG1vY2tlZCBjbGFzcw0KLQkgKiBAcGFyYW0gbW9ja3MgLSB0aGUgYXJyYXkgb2YgbW9ja3MgdG8gYmUgY29udmVydGVkIHRvIHByb3hpZXMNCi0JICogQHBhcmFtIHByb3hpZXMgLSBhbiBhcnJheSBvZiB0aGUgdHlwZSBvZiB0aGUgcHJveHkuIEl0IHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0aGUgcHJveGllcyBmb3IgdGhlIG1vY2tzDQotCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtIHRocm93biBpZiB0aGUgYXJyYXlzIGFyZSB3aXRoIGRpZmZlcmVudCBzaXplcy4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgbW9ja3NUb1Byb3hpZXMoTW9jazxUPltdIG1vY2tzLCBUW10gcHJveGllcykgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2Nrcy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlwcm94aWVzW2ldID0gbW9ja3NbaV0ucHJveHkoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMgYSByZXR1cm4gc3R1YiB0aGF0IHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIG1vY2sgcHJveGllcyBmb3IgdGhlIHN1cHBsaWVkIGFycmF5IG9mIG1vY2tzLg0KLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWVzIC0gYW4gYXJyYXkgb2YgbW9ja3MsIHdob3NlIHByb3hpZXMgaGFzIHRvIGJlIHJldHVybmVkDQotCSAqIEByZXR1cm4gLSBhIHN0dWIgd2ljaCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBwcm94aWVzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBwYXNzZWQgbW9ja3MuDQotCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiAtIGlmIHRoZSB0d28gYXJyYXlzIGFyZSB3aXRoIGRpZmZlcmVudCBsZW5ndGhzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIDxUPlN0dWIgcmV0dXJuQXJyYXlPZk1vY2tzKE1vY2s8VD5bXSByZXR1cm5WYWx1ZXMsIFRbXSBwcm94aWVzKQ0KLQl7DQotCQltb2Nrc1RvUHJveGllcyhyZXR1cm5WYWx1ZXMsIHByb3hpZXMpOw0KLQkJcmV0dXJuIG5ldyBSZXR1cm5TdHViKHByb3hpZXMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgc3R1YiB0aGF0IG9uIGNvbnNlcXV0aXZlIGNhbGxzIHdpbGwgcmV0dXJuIHRoZSBuZXh0IGJvb2xlYW4gaW4gdGhlIHN1cHBsaWVkIGFycmF5IEkuZS4gdGhlIGZpcnN0IGNhbGwgcmV0dXJucyB0aGUgYm9vbGVhbiBhdA0KLQkgKiA8Yz5yZXR1cm5WYWx1ZXNbMF08L2M+LCB0aGUgc2Vjb25kIGNhbGwgd2lsbCByZXR1cm4gdGhlIGJvb2xlYW4gYXQgPGM+cmV0dXJuVmFsdWVzWzFdPC9jPiwgYW5kIHNvIGZvcnRoDQotCSAqIA0KLQkgKiBAcGFyYW0gcmV0dXJuVmFsdWVzIC0NCi0JICogICAgICAgICAgICB0aGUgYm9vbGVhbnMgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBvbiBjb25zZXF1dGl2ZSBjYWxscw0KLQkgKiBAcmV0dXJuIC0gYSBzdHViIHRoYXQgd2lsbCByZXR1cm4gdGhlIGJvb2xlYW5zIGZvciBlYWNoIGNvbnNlcXV0aXZlIGNhbGwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3R1YiBvbkNvbnNlY3V0aXZlQ2FsbHNXaWxsUmV0dXJuQm9vbGVhbihib29sZWFuW10gcmV0dXJuVmFsdWVzKQ0KLQl7DQotCQlmaW5hbCBTdHViW10gcmV0dXJuU3R1YnMgPSBuZXcgU3R1YltyZXR1cm5WYWx1ZXMubGVuZ3RoXTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmV0dXJuVmFsdWVzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCXJldHVyblN0dWJzW2ldID0gbmV3IFJldHVyblN0dWIocmV0dXJuVmFsdWVzW2ldKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgU3R1YlNlcXVlbmNlKHJldHVyblN0dWJzKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIDxUPiBTdHViIHJldHVybkNvbGxlY3Rpb25Db250YWluaW5nKFRbXSBjb250YWluZWQpIHsNCi0JCWZpbmFsIENvbGxlY3Rpb248VD4gY29sbCA9IG5ldyBBcnJheUxpc3Q8VD4oKTsNCi0JCWZvcihUIG8gOiBjb250YWluZWQpIHsNCi0JCQljb2xsLmFkZChvKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgUmV0dXJuU3R1Yihjb2xsKTsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyA8VD4gU3R1YiByZXR1cm5Db2xsZWN0aW9uQ29udGFpbmluZyhUIGNvbnRhaW5lZCkgew0KLQkJZmluYWwgQ29sbGVjdGlvbjxUPiBjb2xsID0gbmV3IEFycmF5TGlzdDxUPigxKTsNCi0JCWNvbGwuYWRkKGNvbnRhaW5lZCk7DQotCQlyZXR1cm4gbmV3IFJldHVyblN0dWIoY29sbCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvQmVmb3JlQWZ0ZXJFbmFibGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9CZWZvcmVBZnRlckVuYWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDlkMTY1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9CZWZvcmVBZnRlckVuYWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogVGhpcyBjbGFzcyBpcyBiYXNlZCBvbiB3b3JrIGJ5IFNoYXkgQmFub24gKGh0dHA6Ly93d3cua2ltY2h5Lm9yZy9iZWZvcmVfYWZ0ZXJfdGVzdGNhc2Vfd2l0aF9qdW5pdC8pDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBCZWZvcmVBZnRlckVuYWJsZXIgew0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBJQmVmb3JlQWZ0ZXJFbmFibGVkIHRjOw0KLQkNCi0gICAgcHJpdmF0ZSBpbnQgdGVzdENvdW50ID0gMDsNCi0gDQotICAgIHByaXZhdGUgZmluYWwgaW50IHRvdGFsVGVzdENvdW50Ow0KLSANCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVBZnRlclRlc3RDYXNlID0gZmFsc2U7DQotIA0KLSAgICBwdWJsaWMgQmVmb3JlQWZ0ZXJFbmFibGVyKElCZWZvcmVBZnRlckVuYWJsZWQgdGMpIHsNCi0gICAgCXRoaXMudGMgPSB0YzsNCi0gICAgCXRvdGFsVGVzdENvdW50ID0gY291bnRUb3RhbFRlc3RzKCk7DQotICAgIH0NCi0gDQotICAgIHB1YmxpYyB2b2lkIHJ1bkJhcmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsNCi0gICAgICAgIFRocm93YWJsZSBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgaWYgKHRlc3RDb3VudCA9PSAwKSB7DQotICAgICAgICAgICAgYmVmb3JlVGVzdENhc2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRlc3RDb3VudCsrOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0Yy5ydW5CYXJlSW50ZXJuYWwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBydW5uaW5nKSB7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gcnVubmluZzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh0ZXN0Q291bnQgPT0gdG90YWxUZXN0Q291bnQpIHsNCi0gICAgICAgICAgICBpZiAoIWRpc2FibGVBZnRlclRlc3RDYXNlKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBhZnRlclRlc3RDYXNlKCk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBhZnRlclRlc3RDYXNlKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpIGV4Y2VwdGlvbiA9IGFmdGVyVGVzdENhc2U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQWZ0ZXJUZXN0Q2FzZSA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgdGhyb3cgZXhjZXB0aW9uOw0KLSAgICB9DQotIA0KLSAgICBwdWJsaWMgdm9pZCBkaXNhYmxlQWZ0ZXJUZXN0Q2FzZSgpIHsNCi0gICAgICAgIGRpc2FibGVBZnRlclRlc3RDYXNlID0gdHJ1ZTsNCi0gICAgfQ0KLSANCi0gICAgLyoqDQotICAgICAqIENhbGxlZCBiZWZvcmUgYW55IHRlc3RzIHdpdGhpbiB0aGlzIHRlc3QgY2FzZS4NCi0gICAgICoNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGJlZm9yZVRlc3RDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgIAl0Yy5iZWZvcmVUZXN0Q2FzZSgpOw0KLSAgICB9DQotIA0KLSAgICAvKioNCi0gICAgICogQ2FsbGVkIGFmdGVyIGFsbCB0aGUgdGVzdHMgd2l0aGluIHRoZSB0ZXN0IGNhc2UNCi0gICAgICogaGF2ZSBleGVjdXRlZC4NCi0gICAgICoNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGFmdGVyVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgCXRjLmFmdGVyVGVzdENhc2UoKTsNCi0gICAgfQ0KLSANCi0gICAgcHJpdmF0ZSBpbnQgY291bnRUb3RhbFRlc3RzKCkgew0KLSAgICAgICAgaW50IGNvdW50ID0gMDsNCi0gICAgICAgIENsYXNzPD8+IHN1cGVyQ2xhc3MgPSB0Yy5nZXRDbGFzcygpOw0KLSAgICAgICAgVmVjdG9yPFN0cmluZz4gbmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsNCi0gICAgICAgIHdoaWxlIChUZXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3VwZXJDbGFzcykpIHsNCi0gICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gc3VwZXJDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsNCi0gICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzLmNvbnRhaW5zKG5hbWUpKQ0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIG5hbWVzLmFkZEVsZW1lbnQobmFtZSk7DQotICAgICAgICAgICAgICAgIGlmIChpc1Rlc3RNZXRob2QobWV0aG9kKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzdXBlckNsYXNzID0gc3VwZXJDbGFzcy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY291bnQ7DQotICAgIH0NCi0gDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Rlc3RNZXRob2QoTWV0aG9kIG0pIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gbS5nZXROYW1lKCk7DQotICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlcnMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7DQotICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gbS5nZXRSZXR1cm5UeXBlKCk7DQotICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5sZW5ndGggPT0gMCAmJiBuYW1lLnN0YXJ0c1dpdGgoInRlc3QiKSAmJiByZXR1cm5UeXBlLmVxdWFscyhWb2lkLlRZUEUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0JlZm9yZUFmdGVyVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0JlZm9yZUFmdGVyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWVhYmE3Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9CZWZvcmVBZnRlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJlZm9yZUFmdGVyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIElCZWZvcmVBZnRlckVuYWJsZWQgew0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBCZWZvcmVBZnRlckVuYWJsZXIgYmZlID0gbmV3IEJlZm9yZUFmdGVyRW5hYmxlcih0aGlzKTsNCi0JDQotCXB1YmxpYyB2b2lkIHJ1bkJhcmVJbnRlcm5hbCgpIHRocm93cyBUaHJvd2FibGUgew0KLQkJc3VwZXIucnVuQmFyZSgpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBydW5CYXJlKCkgdGhyb3dzIFRocm93YWJsZSB7DQotCQliZmUucnVuQmFyZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0VxdWFsc1Rlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9FcXVhbHNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZWQwZTI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0VxdWFsc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLnRlc3RjYXNlczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIEFuIGFic3RyYWN0IHRlc3QgY2FzZSBmb3IgdGhlIDxjPk9iamVjdC5lcXVhbHMoT2JqZWN0KTwvYz4gYW5kIDxjPk9iamVjdC5oYXNoQ29kZSgpPC9jPiBtZXRob2RzLiBUaGlzIHRlc3QgY2FzZSBwZXJmb3JtcyB0aGUgdGVzdHMgZm9yIDxjPmVxdWFsczwvYz4NCi0gKiBhbmQgPGM+aGFzaENvZGU8L2M+IHNpbXVsdGFuaWVzbHkgYXMgdGhleSBhcmUgdGlnaHRseSBjb25uZWN0ZWQuIFRoZSB0ZXNjYXNlIHRlc3QgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG9mIGVxdWFscy9oYXNDb2RlOg0KLSAqIDxwPg0KLSAqIDEuIGVxdWFscyByZWZsZXhpdml0eSAyLiBlcXVhbHMgc3ltZXRyaWNpdHkgMy4gZXF1YWxzIHRyYW5zaXRpdnl0ZSA0LiBoYXNoQ29kZSBzdGF0YmlsaXR5IDUuIGhhc2hDb2RlIGltbXV0YWJpbGl0eSA2LiBlcXVhbHMgaXMgc3VpdGFibGUgZm9yDQotICogc3ViY2xhc3Nlcw0KLSAqIDwvcD4NCi0gKiANCi0gKiBUaGUgdGVzdCBjYXNlcyBpcyBhYnN0cmFjdCBhbmQgbmVlZCB0byBiZSBzdWJsY2Fzc2VkIGJ5IGNvbmNyZXRlIHRlc3QgY2FzZS4gU2V2ZXJhbCBhYnN0cmFjdCBtZXRob2RzIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgdGVzdCBjYXNlcy4NCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqIEBwYXJhbSA8VD4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXF1YWxzVGVzdENhc2U8VD4gZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiB0ZXN0Q2xhc3M7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IDxjPkVxdWFsc1Rlc3RDYXNlPC9jPiBpbnN0YW5jZSB0byB0ZXN0IHRoZSBlcXVhbHMgbWV0aG9kIG9mIHRoZSBzdXBwbGllZCBjbGFzcw0KLQkgKiANCi0JICogQHBhcmFtIHRlc3RDbGFzcyAtDQotCSAqICAgICAgICAgICAgdGhlIGNsYXNzIHdob3NlIGVxdWFscyBtZXRob2Qgd2lsbCBiZSB0ZXN0ZWQNCi0JICovDQotCXB1YmxpYyBFcXVhbHNUZXN0Q2FzZShDbGFzczxUPiB0ZXN0Q2xhc3MpDQotCXsNCi0JCXRoaXMobnVsbCwgdGVzdENsYXNzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyA8Yz5FcXVhbHNUZXN0Q2FzZTwvYz4gaW5zdGFuY2UgdG8gdGVzdCB0aGUgZXF1YWxzIG1ldGhvZCBvZiB0aGUgc3VwcGxpZWQgY2xhc3MuIFRoaXMgdGVzdCBjYXNlIGFsc28gdGFrZXMgYSBuYW1lIHBhcmFtdGVyLCB3aGljaA0KLQkgKiBpIHBhc3NlZCB0byA8Yz5UZXN0Q2FzZTwvYz4gc3VwZXIgY29uc3RydWN0b3IuIEkuZS4gdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlDQotCSAqIA0KLQkgKiBAcGFyYW0gbmFtZSAtDQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGVzdCBjYXNlDQotCSAqIEBwYXJhbSB0ZXN0Q2xhc3MgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBjbGFzcyB3aG9zZSBlcXVhbHMgbWV0aG9kIHdpbGwgYmUgdGVzdGVkDQotCSAqLw0KLQlwdWJsaWMgRXF1YWxzVGVzdENhc2UoU3RyaW5nIG5hbWUsIENsYXNzPFQ+IHRlc3RDbGFzcykNCi0Jew0KLQkJYXNzZXJ0Tm90TnVsbCgidGVzdCBjbGFzcyBwYXNzZWQgaW4gY29uc3RydWN0b3Igd2FzIG51bGwiLCB0ZXN0Q2xhc3MpOw0KLQkJdGhpcy50ZXN0Q2xhc3MgPSB0ZXN0Q2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIE9idGFpbnMgYSBuZXcgaXRlcmF0b3Igb2YgaW5zdGFuY2VzIGZvciB0aGUgdGVzdGVkIGNsYXNzLg0KLQkgKiANCi0JICogQHBhcmFtIGl0ZXJhdGlvbnMgLQ0KLQkgKiAgICAgICAgICAgIG51bWJlciBvZiBpdGVyYXRpb25zIGkuZSB0aGUgbnVtYmVyIG9mIHRpbWVzIG9uZSBjYW4gaW52b2tlIDxjPkl0ZXJhdG9yLm5leHQoKTwvYz4gd2l0aG91dGggZ2V0dGluZyA8Yz5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uPC9jPg0KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbg0KLQkgKiBAcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9mIGluc3RhbmNlZCBmb3IgdGhlIHRlc3RlZCBjbGFzczsNCi0JICovDQotCWFic3RyYWN0IHB1YmxpYyBJdGVyYXRvcjxUPiBuZXdPYmplY3RJdGVyYXRvcihpbnQgaXRlcmF0aW9ucyk7DQotDQotCS8qKg0KLQkgKiBPYnRhaW5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0ZWQgY2xhc3MuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGluc3RhbmNlLCB3aGljaCBpcyBjb25zaWRlcmVkIGVxdWFsIHRvIHRoZSBpbnN0YW5jZQ0KLQkgKiByZXR1cm5lZCBieSB0aGUgcHJlZnZpb3VzIGNhbGwgYnV0IGlzIG5vdCBpZGVudGljYWwuIEZvciBleGFtcGxlIGlmIHRoZSB0ZXN0ZWQgY2xhc3Mgd2FzIDxjPlN0cmluZzwvYz4gdGhlIG1vc3Qgb2J2aW91cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzDQotCSAqIG1ldGhvZCB3b3VsZCBiZSA8Yz4NCi0JICogPHA+DQotCSAqIHJldHVybiBuZXcgU3RyaW5nKCJ0ZXN0IHN0cmluZyIpDQotCSAqIDwvcD4NCi0JICogPC9jPg0KLQkgKiANCi0JICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdCBjbGFzcyBhc3N1bWVkIHRvIGJlIGVxdWFsIHRvIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIGluc3RhbmNlcw0KLQkgKi8NCi0JYWJzdHJhY3QgcHVibGljIFQgbmV3RXF1YWxJbnN0YW5jZSgpOw0KLQ0KLQkvKioNCi0JICogT2J0YWlucyBhIG5ldyBpbnN0YW5jZSBvZiBhIHNpbmdsZSBjbGFzcywgd2hpY2ggaXMgYSBzdWJjbGFzcyBvZiB0aGUgdGVzdGVkIGNsYXNzLiBUaGUgc3ViY2xhc3MgbXVzdCBub3Qgb3ZlcnJpZGUgdGhlIDxjPmVxdWFsczwvYz4gbWV0aG9kIG9mDQotCSAqIHRoZSB0ZXN0ZWQgY2xhc3MuIEFsbCBpbnN0YW5jZXMgc2hvdWxkIGJlIGVxdWFsLiBUaGUgcmV0dXJuZWQgaW5zdGFuY2VzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHZhbHVlcyBvZiBhbGwgdGhlIGluaGVyaXRlZCBmaWVsZHMgYXMgdGhlDQotCSAqIGluc3RhbmNlcyByZXR1cmVkIGJ5IDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+DQotCSAqIA0KLQkgKiBAcmV0dXJuIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2Ygc2luZ2xlIHN1YmxjYXNzIG9mIHRoZSB0ZXN0ZWQgY2xhc3MuIEVhY2ggY2FsbCBzaG91bGQgcmV0dXJuIGFuIGluc3RhbmNlIGVxdWFsIHRvIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIGJ1dA0KLQkgKiAgICAgICAgIG5vdCBpZGVudGljYWwuIE51bGwgaWYgdGhlIHRlc3RlZCBjbGFzcyBpcyBmaW5hbA0KLQkgKi8NCi0JYWJzdHJhY3QgcHVibGljIFQgbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlKCk7DQotDQotCS8qKg0KLQkgKiBPYnRhaW5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0aGUgdGVzdGVkIGNsYXNzLiBUaGUgc2luZ2xlIHJlc3RyaWN0aW9uIG9uIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgaXMgdGhhdCB0aGV5IHNob3VsZCBub3QgYmUgZXF1YWwgdG8gdGhlDQotCSAqIGluc3RhbmNlcyByZXR1cm5lZCBieSA8Yz5uZXdFcXVhbEluc3RhbmNlPC9jPg0KLQkgKiANCi0JICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVzdCBjbGFzcy4gVGhlIG5ld2x5IHJldHVybmVkIGluc3RhbmNlIGlzIG5vdCBlcXVhbCB0byB0aGUgaW5zdGFuY2VzIHJldHVybmVkIGJ5IDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+DQotCSAqLw0KLQlhYnN0cmFjdCBwdWJsaWMgVCBuZXdOb25FcXVhbEluc3RhbmNlKCk7DQotDQotCS8qKg0KLQkgKiBNb2RpZmllcyBhIGdpdmVuIGluc3RhbmNlIG9mIHRoZSB0ZXN0ZWQgY2xhc3MuIFRoZSBpbnN0YW5jZSBzaG91bGQgYmUgbW9kaWZpZWQgaW4gc3VjaCBhIHdheSB0aGF0IGl0J3Mgbm90IGVxdWFsIHRvIHRoZSBpbnN0YW5jZXMgcmV0dXJlZCBieQ0KLQkgKiA8Yz5uZXdFcXVhbEluc3RhbmNlPC9jPiBhbnMgPGM+bmV3Tm9uZUVxdWFsSW5zdGFuY2UoKTwvYz4uIElmIHRoZSB0ZXN0ZWQgY2xhc3MgaXMgaW1tdXRhYmxlIHRoZW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBiZQ0KLQkgKiBlbXB0eQ0KLQkgKiANCi0JICogQHBhcmFtIGluc3RhbmNlIC0NCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2UgdG8gYmUgbW9kaWZpZWQuDQotCSAqLw0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCBtb2RpZnlPYmplY3RJbnN0YW5jZShUIGluc3RhbmNlKTsNCi0NCi0JLyoqDQotCSAqIE9idGFpbnMgdGhlIG51bWJlciBvZiBjb21wYXJpc29ucyB0aGF0IHdpbGwgYmUgbWFkZSBmb3IgdGhlIHJlZmxleGl2aXR5IHRlc3QuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcyB0byBzcGVjaWZ5IGEgZGlmZmVyZW50DQotCSAqIHZhbHVlLiBCeSBkZWZhdWx0IHRoaXMgbnVtYmVyIGlzIDEwMC4NCi0JICogDQotCSAqIEByZXR1cm4gLSB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBiZSBtYWRlIGZvciB0aGUgcmVmbGV4aXZpdHkgdGVzdC4NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uc0ZvclJlZmxpeGl2aXR5VGVzdCgpDQotCXsNCi0JCXJldHVybiAxMDA7DQotCX0NCi0NCi0JLyoqDQotCSAqIE9iYXRhaW5zIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgdGhhdCB3aWxsIGJlIG1hZGUgZm9yIHRoZSBzeW1pdHJpY2l0eSB0ZXN0LiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGUgYnkgc3ViY2xhc3NlcyB0byBzcGVjaWZ5IGEgZGlmZmVyZW50DQotCSAqIHZhbHVlLiBCeSBkZWZhdWx0IHRoaXMgbnVtYmVyIGlzIDEwMDANCi0JICogDQotCSAqIEByZXR1cm4gLSB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBiZSBtYWRlIGZvciB0aGUgcmVmbGl4aXZpdHkgdGVzdC4NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uc0ZvclN5bWV0cmljaXR5VGVzdCgpDQotCXsNCi0JCXJldHVybiAxMDAwOw0KLQl9DQotDQotCS8qKg0KLQkgKiBPYmF0YWlucyB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBiZSBtYWRlIGZvciB0aGUgdHJhbnNpdGl2aXR5IHRlc3QuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZSBieSBzdWJjbGFzc2VzIHRvIHNwZWNpZnkgYQ0KLQkgKiBkaWZmZXJlbnQgdmFsdWUuIEJ5IGRlZmF1bHQgdGhpcyBudW1iZXIgaXMgMjAwMA0KLQkgKiANCi0JICogQHJldHVybiAtIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgdGhhdCB3aWxsIGJlIG1hZGUgZm9yIHRoZSB0cmFuc2l0aXZpdHkgdGVzdC4NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SXRlcmF0aW9uc0ZvclRyYW5zaXRpdml0eVRlc3QoKQ0KLQl7DQotCQlyZXR1cm4gMjAwMDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCBlcXVhbHMgaXMgcmVmbGV4aXZlLiBJdCBlbmZvcmNlcyB0aGUgcnVsZSBhLmVxdWFscyhhKSA9PSB0cnVlLiBUaGlzIHRlc3QgYWxzbyB0ZXN0cyB0aGF0IGhhc2hDb2RlIGZ1bmN0aW9uIGlzIHN0YWJsZSgpLiBJLmUuDQotCSAqIGhhc2hDb2RlIGRvZXNuJ3QgY2hhbmdlIGl0J3MgdmFsdWUgYmV0d2VlbiBzZXZlcmFsIGludm9jYXRpb25zLCBhcyB3ZWxsIGFzIHRoYXQgaGFzaENvZGUgaXMgaW1tdXRhYmxlIG92ZXIgb2JqZWN0IGNoYW5nZS4gVGhlIHRlc3Qgc3RyYXRlZ3kgaXMNCi0JICogdG8gY3JlYXRlIGFuIG5ldyBvYmplY3QgaXRlcmF0b3IgYW5kIHRoZW4gZm9yIGVhY2ggcmV0dXJuZWQgaW5zdGFuY2U6DQotCSAqIA0KLQkgKiA8b2w+DQotCSAqIDxsaT5Db21wYXJlIGl0IHdpdGggaXRzZWxmPC9saT4NCi0JICogPGxpPmNoZWNrIHRoYXQgaXRzIGhhc2ggY29kZSBzdGF5cyB0aGUgc2FtZTwvbGk+DQotCSAqIDxsaT5tb2RpZnkgdGhlIHJldHVybmVkIGluc3RhbmNlIGJ5IGNhbGxpbmcgPGM+bW9kaWZ5SW5zdGFuY2U8L2M+IGFuZCB0aGVuIGNoZWNrIHRoZSBoYXNoQ29kZSBhZ2FpbjwvbGk+DQotCSAqIDwvb2w+DQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEVxdWxzUmVmbGV4aXZlKCkNCi0Jew0KLQkJZmluYWwgaW50IGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCA9IGdldEl0ZXJhdGlvbnNGb3JSZWZsaXhpdml0eVRlc3QoKTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRpdGVyYXRvciA9IG5ld09iamVjdEl0ZXJhdG9yKGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCk7DQotCQl3aGlsZSAob2JqZWN0VGl0ZXJhdG9yLmhhc05leHQoKSkNCi0JCXsNCi0JCQlmaW5hbCBUIG9iamVjdFQgPSBvYmplY3RUaXRlcmF0b3IubmV4dCgpOw0KLQkJCWFzc2VydFRydWUoImVxdWFscyBpcyBub3QgcmVmbGV4aXZlIiwgb2JqZWN0VC5lcXVhbHMob2JqZWN0VCkpOw0KLQkJCWZpbmFsIGludCBpbml0aWFsSGFzaENvZGUgPSBvYmplY3RULmhhc2hDb2RlKCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zRm9yVGhpc1Rlc3Q7IGkrKykNCi0JCQl7DQotCQkJCWFzc2VydEVxdWFscygiaGFzaENvZGUgaXMgbm90IHN0YWJsZSB1cG9uIG11bHRpcGxlIGNhbGxzIiwgaW5pdGlhbEhhc2hDb2RlLCBvYmplY3RULmhhc2hDb2RlKCkpOw0KLQkJCX0NCi0JCQltb2RpZnlPYmplY3RJbnN0YW5jZShvYmplY3RUKTsNCi0JCQlhc3NlcnRFcXVhbHMoImhhc2hDb2RlIGlzIG5vdCBzdGFibGUgdXBvbiBtb2RpZmljYXRpb24gb2YgdGhlIG9iamVjdCIsIGluaXRpYWxIYXNoQ29kZSwgb2JqZWN0VC5oYXNoQ29kZSgpKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCBlcXVhbHMgaXMgc3ltZXRyaWMgaS5lLiBhLmVxdWFscyhiKSA8PT0+IGIuZXF1YWxzKGEpLiBUaGlzIG1ldGhvZCBhbHNvIHRlc3RzIHRoYXQgaGFzaENvZGUgYmVoYXZlcyBjb3JyZWN0bHkgaW4gc2Vuc2UgYS5xdWFscyhiKSA9Pg0KLQkgKiBhLmhhc2hDb2RlKCkgPT0gYi5oYXNoQ29kZSgpLiBUaGlzIHRlc3QgdXNlcyB0d28gb2JqZWN0IGl0ZXJhdG9ycy4gT25lIGZvciBhIGFuZCBvbmUgZm9yIGIsIHdoZXJlIGEgYW5kIGIgYXJlIGZyb20gdGhlIGFib3ZlIHJ1bGUuIEVhY2ggb2YNCi0JICogdGhlc2UgaXRlcmF0b3JzIGFyZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRoaXMgbWV0aG9kIGFsc28gY2hlY2tzIHRoYXQgd2hlbmV2ZXIgdHdvIGluc3RhbmNlcyByZXR1cm5lZCBieSB0aGUgdHdvDQotCSAqIGl0ZXJhdG9ycyBhcmUgZXF1YWwgdGhlbiB0aGVpciBoYXNjb2RlIGlzIGVxdWFsLg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNTeW1ldHJpYygpDQotCXsNCi0JCWZpbmFsIGludCBpdGVyYXRpb25zRm9yVGhpc1Rlc3QgPSBnZXRJdGVyYXRpb25zRm9yU3ltZXRyaWNpdHlUZXN0KCk7DQotCQlmaW5hbCBJdGVyYXRvcjxUPiBvYmplY3RUSXRlcmF0b3IxID0gbmV3T2JqZWN0SXRlcmF0b3IoaXRlcmF0aW9uc0ZvclRoaXNUZXN0KTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRJdGVyYXRvcjIgPSBuZXdPYmplY3RJdGVyYXRvcihpdGVyYXRpb25zRm9yVGhpc1Rlc3QpOw0KLQkJd2hpbGUgKG9iamVjdFRJdGVyYXRvcjEuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoIlRoZSB0d28gb2JqZWN0IGl0ZXJhdG9ycyBkb24ndCBoYXZlIGVxdWFsIG51bWJlciBvZiBvYmplY3RzIiwgb2JqZWN0VEl0ZXJhdG9yMi5oYXNOZXh0KCkpOw0KLQkJCWZpbmFsIFQgb2JqZWN0VDEgPSBvYmplY3RUSXRlcmF0b3IxLm5leHQoKTsNCi0JCQlmaW5hbCBUIG9iamVjdFQyID0gb2JqZWN0VEl0ZXJhdG9yMi5uZXh0KCk7DQotCQkJaWYgKG9iamVjdFQxLmVxdWFscyhvYmplY3RUMikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKCJFcXVhbHMgaXMgbm90IHN5bWV0cmljIiwgb2JqZWN0VDIuZXF1YWxzKG9iamVjdFQxKSk7DQotCQkJCWFzc2VydFRydWUoIkhhc2hjb2RlIGlzIG5vdCB0aGUgc2FtZSBmb3IgZXF1YWwgaW5zdGFuY2VzIiwgb2JqZWN0VDEuaGFzaENvZGUoKSA9PSBvYmplY3RUMi5oYXNoQ29kZSgpKTsNCi0JCQl9IGVsc2UgaWYgKG9iamVjdFQyLmVxdWFscyhvYmplY3RUMSkpDQotCQkJew0KLQkJCQlmYWlsKCJFcXVhbHMgaXMgbm90IHN5bWV0cmljIik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IGVxdWFscyBpcyB0cmFuc2l0aXZlIGkuZS4gYS5lcXVhbHMoYikgJiBiLmVxdWFscyhjKSA9PiBhLmVxdWFscyhjKS4gVGhpcyB0ZXN0IHVzZXMgdGhyZWUgb2JqZWN0IGl0ZXJhdG9ycy4gT25lIGZvciBhLCBvbmUgZm9yIGIsIGFuZA0KLQkgKiBvbmUgZm9yIGMsIHdoZXJlIGEsYixjIGFyZSBmcm9tIHRoZSBhYm92ZSBydWxlLiBFYWNoIG9mIHRoZXNlIGl0ZXJhdG9ycyBhcmUgaW5zdGFudGlhdGVkIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc1RyYW5zaXRpdmUoKQ0KLQl7DQotCQlmaW5hbCBpbnQgaXRlcmF0aW9uc0ZvclRoaXNUZXN0ID0gZ2V0SXRlcmF0aW9uc0ZvclRyYW5zaXRpdml0eVRlc3QoKTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRJdGVyYXRvcjEgPSBuZXdPYmplY3RJdGVyYXRvcihpdGVyYXRpb25zRm9yVGhpc1Rlc3QpOw0KLQkJZmluYWwgSXRlcmF0b3I8VD4gb2JqZWN0VEl0ZXJhdG9yMiA9IG5ld09iamVjdEl0ZXJhdG9yKGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCk7DQotCQlmaW5hbCBJdGVyYXRvcjxUPiBvYmplY3RUSXRlcmF0b3IzID0gbmV3T2JqZWN0SXRlcmF0b3IoaXRlcmF0aW9uc0ZvclRoaXNUZXN0KTsNCi0NCi0JCXdoaWxlIChvYmplY3RUSXRlcmF0b3IxLmhhc05leHQoKSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJUaGUgdGhyZWUgb2JqZWN0IGl0ZXJhdG9ycyBkb24ndCBoYXZlIGVxdWFsIG51bWJlciBvZiBvYmplY3RzIiwgb2JqZWN0VEl0ZXJhdG9yMi5oYXNOZXh0KCkpOw0KLQkJCWFzc2VydFRydWUoIlRoZSB0aHJlZSBvYmplY3QgaXRlcmF0b3JzIGRvbid0IGhhdmUgZXF1YWwgbnVtYmVyIG9mIG9iamVjdHMiLCBvYmplY3RUSXRlcmF0b3IzLmhhc05leHQoKSk7DQotCQkJZmluYWwgVCBvYmplY3RUMSA9IG9iamVjdFRJdGVyYXRvcjEubmV4dCgpOw0KLQkJCWZpbmFsIFQgb2JqZWN0VDIgPSBvYmplY3RUSXRlcmF0b3IyLm5leHQoKTsNCi0JCQlmaW5hbCBUIG9iamVjdFQzID0gb2JqZWN0VEl0ZXJhdG9yMy5uZXh0KCk7DQotDQotCQkJaWYgKG9iamVjdFQxLmVxdWFscyhvYmplY3RUMikgJiYgb2JqZWN0VDEuZXF1YWxzKG9iamVjdFQzKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoImVxdWFscyBpcyBub3QgdHJhbnNpdGl2ZSIsIG9iamVjdFQyLmVxdWFscyhvYmplY3RUMykpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCA8Yz5lcXVhbDwvYz4gcmV0dXJucyBmYWxzZSBpZiA8Yz5udWxsPC9jPiBpcyBwYXNzZWQgYXMgYXJndW1lbnQNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzUmV0dXJuc0ZhbHNlSWZOdWxsUGFzc2VkKCkNCi0Jew0KLQkJZmluYWwgVCBvYmplY3RUID0gdGhpcy5uZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlhc3NlcnRGYWxzZSgiZXF1YWxzIHJldHVybmVkIHRydWUgd2hlbiBudWxsIHBhc3NlZCBmb3Igb3RoZXIgb2JqZWN0Iiwgb2JqZWN0VC5lcXVhbHMobnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IDxjPmVxdWFsPC9jPiByZXR1cm5zIGZhbHNlIGlmIGEgbm9uLWVxdWFsIG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuIFRoZSB0d28gbm9uIGVxdWFsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBieSBjYWxsaW5nDQotCSAqIDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+IGFuZCA8Yz4gbmV3Tm9uRXF1YWxJbnN0YW5jZTwvYz4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzUmV0dXJuc0ZhbHNlT25Ob25FcXVhbHMoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQxID0gdGhpcy5uZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlmaW5hbCBUIG9iamVjdFQyID0gdGhpcy5uZXdOb25FcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlhc3NlcnRUcnVlKCJFcXVhbHMgcmVwb3J0ZWQgdHJ1ZSBmb3IgaW5zdGFuY2VzIGFzc3VtZWQgbm9uIGVxdWFsLiIsICFvYmplY3RUMS5lcXVhbHMob2JqZWN0VDIpICYmICFvYmplY3RUMi5lcXVhbHMob2JqZWN0VDEpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCA8Yz5lcXVhbDwvY0wgcmV0dXJucyB0cnVlIGlmIGFuIGVxdWFsIG9iamVjdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuIFRoZSBpbnN0YW5jZXMgdGhhdCBhcmUgY29tcGFyZWQgYXJlIG9idGFpbmVkIGJ5IHR3bw0KLQkgKiBjb25zZWN1dGl2ZSBjYWxscyB0byA8Yz5uZXdFcXVhbEluc3RhbmNlPC9jPg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNSZXR1cm5zVHJ1ZU9uRXF1YWxzKCkNCi0Jew0KLQkJZmluYWwgVCBvYmplY3RUMSA9IHRoaXMubmV3RXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJZmluYWwgVCBvYmplY3RUMiA9IHRoaXMubmV3RXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJYXNzZXJ0VHJ1ZSgiRXF1YWxzIHJlcG9ydGVkIGZhbHNlIGZvciBpbnN0YW5jZXMgYXNzdW1lZCBlcXVhbC4iLCBvYmplY3RUMS5lcXVhbHMob2JqZWN0VDIpICYmIG9iamVjdFQyLmVxdWFscyhvYmplY3RUMSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IGVxdWFscyByZXR1cm5zIGZhbHNlIGlmIGFuIG9iamVjdCBvZiBhbm90aGVyIGNsYXNzIGlzIHBhc3NlZC4gSW4gY2FzZSB0aGF0IHRoZSB0ZXN0ZWQgY2xhc3MgaXMgbm90IGZpbmFsIHRoaXMgdGVzdCBwYXNzZXMgYSBzdWJjbGFzcw0KLQkgKiBvZiB0aGUgdGVzdCBjbGFzcyBhcyBhbiBhcmd1bWVudCB0byA8Yz5lcXVhbHM8L2M+LiBUaGUgcGFzc2VkIGFuY2VzdG9yIG9iamVjdCBoYXMgdGhlIHNhbWUgdmFsdWUgZm9yIGFsbCBpdHMgZmllbGQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gY2FodGNoDQotCSAqIHdyb25nIGltcGxlbWVudGF0aW9ucyB1c2luZyAiaW5zdGFuY2VvZiIgcmF0aGVyIHRoYW4gPGM+Z2V0Q2xhc3MoKSA9PSBvdGhlci5nZXRDbGFzcygpPC9jPg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNSZXR1cm5zRmFsc2VJZk90aGVyQ2xhc3NQYXNzZWQoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlPYmplY3Qgb2JqZWN0ID0gbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlpZiAob2JqZWN0ID09IG51bGwpDQotCQl7DQotCQkJLy8gY2xhc3MgaXMgZmluYWwuIE5vIGFuY2VzdG9yIGNvdWxkIGJlIGNyZWF0ZWQuIFVzZSBzb21lIG90aGVyIGNsYXNzLg0KLQkJCW9iamVjdCA9IG5ldyBPYmplY3QoKTsNCi0JCX0NCi0JCWFzc2VydEZhbHNlKCJlcXVhbHMgcmV0dXJuZWQgdHJ1ZSB3aGVuIG9iamVjdCBvZiBhbm90aGVyIHR5cGUgcGFzc2VkIiwgb2JqZWN0VC5lcXVhbHMob2JqZWN0KSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRlc3RzIHRoYXQgPGM+ZXF1YWxzPC9jPiBpcyBwcm9wZXJseSBpbXBsZW1lbnRlZCBmb3IgdXNlIGluIHN1YmNsYXNzZXMuIEl0IHRha2VzIHR3byBlcXVhbCBhbmNlc3RvciBpbnN0YW5jZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yIGVxdWFsaXR5Lg0KLQkgKiBTaW5jZSB0aGUgYW5jZXN0b3IgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGVxdWFscyBtZXRob2QuIFRoZSB0ZXN0cyBhc3NlcnRzIHRoYXQgZXF1YWxzIHNob3VsZCByZXR1cm4gdHJ1ZS4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzU3VpdGFibGVGb3JBbmNlc3RvcnMoKQ0KLQl7DQotCQlmaW5hbCBUIGFuY2VzdG9yVDEgPSBuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKTsNCi0JCWZpbmFsIFQgYW5jZXN0b3JUMiA9IG5ld0FuY2VzdG9yRXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJaWYgKGFuY2VzdG9yVDEgPT0gbnVsbCkNCi0JCXsNCi0JCQlhc3NlcnROdWxsKA0KLQkJCQkJCQkJCQkJIlRoZSBuZXdBbmNlc3Rvckluc3RhbmNlKCkgbWV0aG9kIHJldHVybmVkIG51bGwgb24gdGhlIHNlY29uZCBpbnZvY2F0aW9uLCB3aGlsZSBpdCByZXR1cm4gYSB2YWx1ZSBkaWZmZXJldCB0aGFuIG51bGwgZnJvbSB0aGUgZmlyc3QiLA0KLQkJCQkJCQkJCQkJYW5jZXN0b3JUMik7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJYXNzZXJ0VHJ1ZShhbmNlc3RvclQxLmVxdWFscyhhbmNlc3RvclQyKSAmJiBhbmNlc3RvclQyLmVxdWFscyhhbmNlc3RvclQxKSk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld0FuY2VzdG9yRXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpDQotCXsNCi0JCWZpbmFsIFQgYW5jZXN0b3JUID0gbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlKCk7DQotCQlpZiAoYW5jZXN0b3JUID09IG51bGwpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSgibmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlIHJldHVybmVkIG51bGwsIGFsdGhvdWdoIHRoZSB0ZXN0IGNsYXNzICIsIE1vZGlmaWVyLmlzRmluYWwodGVzdENsYXNzLmdldE1vZGlmaWVycygpKSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2UgcmV0dXJuZWQgb2JqZWN0IG9mIGNsYXNzICIgKyBhbmNlc3RvclQuZ2V0Q2xhc3MoKSArICIsIHdoaWNoIGlzIG5vdCBzdWJ0eXBlIG9mICINCi0JCQkJCQkJCQkJCSsgdGVzdENsYXNzLmdldE5hbWUoKSwgdGVzdENsYXNzLmlzQXNzaWduYWJsZUZyb20oYW5jZXN0b3JULmdldENsYXNzKCkpKTsNCi0JCX0NCi0JCXJldHVybiBhbmNlc3RvclQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld0VxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdFcXVhbEluc3RhbmNlKCk7DQotCQlhc3NlcnRUcnVlKCJuZXdFcXVhbEluc3RhbmNlIHJldHVybmVkIG9iamVjdCBvZiBjbGFzcyAiICsgb2JqZWN0VC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJFeHBlY3RlZCB3YXMgY2xhc3MgIiArIHRlc3RDbGFzcy5nZXROYW1lKCksDQotCQkJCQkJCQkJCXRlc3RDbGFzcyA9PSBvYmplY3RULmdldENsYXNzKCkpOw0KLQkJcmV0dXJuIG9iamVjdFQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBUIG5ld05vbkVxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSBuZXdOb25FcXVhbEluc3RhbmNlKCk7DQotCQlhc3NlcnRUcnVlKCJuZXdOb25FcXVhbEluc3RhbmNlIHJldHVybmVkIG9iamVjdCBvZiBjbGFzcyAiICsgb2JqZWN0VC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJFeHBlY3RlZCB3YXMgY2xhc3MgIiArIHRlc3RDbGFzcy5nZXROYW1lKCksDQotCQkJCQkJCQkJCXRlc3RDbGFzcyA9PSBvYmplY3RULmdldENsYXNzKCkpOw0KLQkJcmV0dXJuIG9iamVjdFQ7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvSUJlZm9yZUFmdGVyRW5hYmxlZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvSUJlZm9yZUFmdGVyRW5hYmxlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTE1ZWVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0lCZWZvcmVBZnRlckVuYWJsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXM7DQotDQotcHVibGljIGludGVyZmFjZSBJQmVmb3JlQWZ0ZXJFbmFibGVkIHsNCi0NCi0JcHVibGljIHZvaWQgYmVmb3JlVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uOw0KLQkNCi0JcHVibGljIHZvaWQgYWZ0ZXJUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb247DQotCQ0KLQlwdWJsaWMgdm9pZCBydW5CYXJlSW50ZXJuYWwoKSB0aHJvd3MgVGhyb3dhYmxlOw0KLQkNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam9icy9Kb2JVdGlscy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qb2JzL0pvYlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1ZTIwOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qb2JzL0pvYlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnM7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guVHlwZU5hbWVSZXF1ZXN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMudGhyZWFkaW5nLlRlc3RDb250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotDQotcHVibGljIGNsYXNzIEpvYlV0aWxzDQotew0KLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckpvYnNJbnRlcnJ1cHRhYmxlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCXdoaWxlIChQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpICE9IG51bGwpDQotCQl7DQotCQkJZGVsYXkoNSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JKb2JzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl3YWl0Rm9yRHVtbXlKb2IoSm9iLklOVEVSQUNUSVZFKTsNCi0JCQ0KLQkJd2hpbGUgKHRydWUpDQotCQl7DQotCQkJdHJ5DQotCQkJew0KLQkJCQl3YWl0Rm9ySm9ic0ludGVycnVwdGFibGUoKTsNCi0JCQkJYnJlYWs7DQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpDQotCQkJew0KLQ0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGkwMzY1MDkgYWRkZWQgY291c2Ugd2FpdGluZyBmb3Igam9icyBpcyBub3QgZW5vdWdodA0KLQkJd2FpdEZvckluZGV4ZXIoKTsNCi0JCQ0KLQkJLy8gRm9yY2Ugbm90aWZpY2F0aW9ucw0KLQkJd2FpdEZvck5vdGlmaWNhdGlvbnMoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsYXkoZmluYWwgbG9uZyBtaWxsaXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQl7DQotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsNCi0JCS8vIGlmIHRoaXMgaXMgdGhlIFVJIHRocmVhZCwgdGhlbiBwcm9jZXNzIHRoZSBpbnB1dA0KLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkNCi0JCXsNCi0JCQlmaW5hbCBsb25nIGVudFRpbWVNaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIG1pbGxpczsNCi0JCQl3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBlbnRUaW1lTWlsbGlzKQ0KLQkJCXsNCi0JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQ0KLQkJCQl7DQotCQkJCQlkaXNwbGF5LnNsZWVwKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJZGlzcGxheS51cGRhdGUoKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCVRocmVhZC5zbGVlcCgxMDAwKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JJbmRleGVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoQWxsVHlwZU5hbWVzKG51bGwsU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENILCBudWxsLCANCi0JCQkJU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUywgU2VhcmNoRW5naW5lDQotCQkJCQkJCQkJCQkJCQkJCQkJLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50WzBdKSwgbmV3IFR5cGVOYW1lUmVxdWVzdG9yKCkNCi0JCQkJCQkJCQkJew0KLQkJCQkJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBhY2NlcHRDbGFzcyhjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLA0KLQkJCQkJCQkJCQkJCQkJCQkJCQlTdHJpbmcgcGF0aCkNCi0JCQkJCQkJCQkJCXsNCi0JCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KLQkJCQkJCQkJCQkJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsDQotCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQ0KLQkJCQkJCQkJCQkJew0KLQkJCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCQl9LCBJSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwgbnVsbCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTY2hlZHVsZSBhIGR1bW15IGpvYiB3aXRoIHRoZSBwcmlvcml0eSBzcGVjaWZpZWQgYW5kIHdhaXQgZm9yIGl0IGlzIGRvbmUNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvckR1bW15Sm9iKGZpbmFsIGludCBwcmlvcml0eSkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJd2FpdEZvckR1bW15Sm9iV2l0aFByaW8ocHJpb3JpdHkpOw0KLQkJfQ0KLQkJY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQkNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yRHVtbXlKb2JXaXRoUHJpbyhmaW5hbCBpbnQgcHJpbykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCUpvYiBteUR1bW15Sm9iID0gbmV3IEpvYigiRFVNTVkiKXsNCi0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQkJfX07DQotCQkJDQotCQlteUR1bW15Sm9iLnNldFByaW9yaXR5KHByaW8pOw0KLQkJbXlEdW1teUpvYi5zZXRVc2VyKGZhbHNlKTsNCi0JCW15RHVtbXlKb2Iuc2NoZWR1bGUoKTsNCi0JCQ0KLQkJbXlEdW1teUpvYi5qb2luKCk7DQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICogRm9yY2VzIGRlbGl2ZXJpbmcgb2Ygbm90aWZpY2F0aW9uIGV2ZW50cy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QgaXMgImluc3BpcmVkIiBieSBOb3RpZmljYXRpb25NYW5hZ2VyJ3Mgbm90aWZpY2F0aW9uIGpvYg0KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yTm90aWZpY2F0aW9ucygpDQotCXsNCi0JCWZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOw0KLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIGR1bW15UnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCl7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JCQl7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJZmluYWwgSm9iIG5vdGlmRm9yY2luZ0pvYiA9IG5ldyBKb2IoIkRlbGl2ZXJpbmcgbm90aWZpY2F0aW9ucy4uLiIpew0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJew0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJd29ya3NwYWNlLnJ1bihkdW1teVJ1bm5hYmxlLCBudWxsLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbnVsbCk7DQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoIGUuZ2V0TWVzc2FnZSgpLCBlICk7DQotCQkJCX0NCi0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7DQotCQkJfX07DQotCQkNCi0JCXN5bmNFeGVjSm9iKG5vdGlmRm9yY2luZ0pvYiwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckpvYnNTbG93KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl3YWl0Rm9ySm9icygpOw0KLQkJd2FpdEZvckR1bW15Sm9iKEpvYi5ERUNPUkFURSk7DQotCQkNCi0JCXdhaXRGb3JFdmVudExvb3AoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRGb3JFdmVudExvb3AoKQ0KLQl7DQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsNCi0JCQ0KLQkJZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKXsNCi0NCi0JCQlwdWJsaWMgdm9pZCBydW4oKQ0KLQkJCXsNCi0JCQkJLy8gTGV0IHRoZSBkaXNwbGF5IHByb2Nlc3MgdGhlIGV2ZW50cyBpbiBpdHMgcXVldWUNCi0JCQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7fTsNCi0JCQl9fTsNCi0JCQ0KLQkJaWYoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkNCi0JCXsNCi0JCQlydW5uYWJsZS5ydW4oKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlkaXNwbGF5LnN5bmNFeGVjKHJ1bm5hYmxlKTsNCi0JCX0NCi0JCQkNCi0JfQ0KLQ0KLQkvKioNCi0JICogRXhlY3V0ZXMgc3luY2hyb25vdXNseSAoc2NoZWR1bGVzIGFuZCBqb2lucykgdGhlIGpvYiBzcGVjaWZpZWQuPGJyPg0KLQkgKiBJZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQsIHRoZSBqb2IgaXMgc2NoZWR1bGVkIGFuZCBqb2luZWQgaW4gYSBtb2RhbCBjb250ZXh0IHRocmVhZCB0aHVzIGxldHRpbmcgdGhlIGV2ZW50IGxvb3AgcHJvY2VzcyBhc3luY2hyb25vdXMgZXZlbnRzPGJyPg0KLQkgKiBJZiB0aGUgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGEgd29ya2VyIHRocmVhZCwgdGhlIGpvYiBpcyBzY2hlZHVsZWQgYW5kIGpvaW5lZCBpbiB0aGUgY2FsbGVyIHRocmVhZC4NCi0JICogDQotCSAqIEBwYXJhbSBqb2INCi0JICogQHBhcmFtIGRpc3BsYXkNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgc3luY0V4ZWNKb2IoZmluYWwgSm9iIGpvYiwgZmluYWwgRGlzcGxheSBkaXNwbGF5KQ0KLQl7DQotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkNCi0JCXsNCi0NCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0JCQl7DQotCQkJCWpvYi5zY2hlZHVsZSgpOw0KLQkJCQl0cnkNCi0JCQkJew0KLQkJCQkJam9iLmpvaW4oKTsNCi0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0JCXRyeQ0KLQkJew0KLQkJCVRlc3RDb250ZXh0LnJ1bihydW5uYWJsZSwgRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgZGlzcGxheSk7DQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpDQotCQl7DQotCQkJbG9nZ2VyKCkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dEZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvQ2xhc3NMb2FkaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L0NsYXNzTG9hZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNjYWM0OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvQ2xhc3NMb2FkaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotDQotLyoqDQotICogRXh0ZW5kcyB7QGxpbmsgUHJvamVjdEJhc2VkVGVzdH0gYnkgYWRkaW5nIGZpbmN0aW9uYWxpdGllcyB0byBjcmVhdGUgY2xhc3NlcyBpbiBzb21lIHBhY2thZ2UgZWlkZXIgYnkgcmVhZGluZyBpdCBmcm9tIHRleHQgZmlsZSBvciBwYXNzZWQgYXMNCi0gKiBzdHJpbmdzLg0KLSAqIA0KLSAqIDwvcHJlPg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikNCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NMb2FkaW5nVGVzdCBleHRlbmRzIFByb2plY3RCYXNlZFRlc3QNCi17DQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0VYVCA9ICIuamF2YSI7DQotDQotCXByaXZhdGUgZmluYWwgc3RhdGljIGNoYXIgU0VQQVJBVE9SID0gJyMnOw0KLQ0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBkZWZhdWx0UGFja2FnZTsNCi0NCi0JcHVibGljIHZvaWQgY3JlYXRlSmF2YVByb2plY3QoU3RyaW5nIHNyY0ZvbGRlciwgU3RyaW5nIGRlZmF1bHRQYWNrYWdlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3Qoc3JjRm9sZGVyKTsNCi0NCi0JCWlmIChkZWZhdWx0UGFja2FnZU5hbWUgIT0gbnVsbCkNCi0JCXsNCi0JCQlkZWZhdWx0UGFja2FnZSA9IGdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChkZWZhdWx0UGFja2FnZU5hbWUsIHRydWUsIG51bGwpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBjbGFzcyBpbiB0ZXN0IHByb2plY3QuIDxjb2RlPnNvdXJjZUZpbGVQYXRoPC9jb2RlPiBtdXN0IGNvbnRhaW4gdGhlIGNsYXNzIHNvdXJjZSB3aXRob3V0IHBhY2thZ2UgZGVjbGFyYXRpb24uIFRoZSBjbGFzcyBpcyBjcmVhdGVkIGluDQotCSAqIGRlZmF1bHQgcGFja2FnZS4NCi0JICogDQotCSAqIFByb2plY3QgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gc291cmNlRmlsZVBhdGgNCi0JICogQHBhcmFtIGNsYXNzTmFtZQ0KLQkgKiBAcmV0dXJuIElUeXBlIG9iamVjdCBmb3IgdGhlIGNyZWF0ZWQgY2xhc3MNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIElUeXBlIGNyZWF0ZUNsYXNzKFN0cmluZyBzb3VyY2VGaWxlUGF0aCwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHNvdXJjZUZpbGVQYXRoID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzb3VyY2VGaWxlUGF0aCBzaG91bGQgbm90IGJlIG51bGwuIik7DQotCQl9DQotDQotCQlTdHJpbmcgc291cmNlID0gVGVzdFByb2plY3RzVXRpbHMucmVhZFNvdXJjZSh0aGlzLmdldENsYXNzKCksIHNvdXJjZUZpbGVQYXRoKTsNCi0NCi0JCXJldHVybiBjcmVhdGVDbGFzcyhkZWZhdWx0UGFja2FnZSwgY2xhc3NOYW1lLCBzb3VyY2UpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNsYXNzIGluIDxjb2RlPnBjazwvY29kZT4gcGFja2FnZSB3aXRoIG5hbWUgYW5kIHNvdXJjZSA8Y29kZT5jbGFzc05hbWUsIHNvdXJjZTwvY29kZT4uIFNvdXJjZSBtdXN0IG5vdCBpbmNsdXNlIHBhY2thZ2UNCi0JICogZGVjbGFyYXRpb24uIFByb2plY3QgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGNrDQotCSAqIEBwYXJhbSBjbGFzc05hbWUNCi0JICogQHBhcmFtIHNvdXJjZQ0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaW4gY2FzZSBzb21lIG9mIHRoZSBwYXJhbXMgaXMgbnVsbC4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXByb3RlY3RlZCBJVHlwZSBjcmVhdGVDbGFzcyhJUGFja2FnZUZyYWdtZW50IHBjaywgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbSAnY2xhc3NOYW1lJyBzaG91bGQgbm90IGJlIG51bGwuIik7DQotCQl9DQotDQotCQlpZiAoc291cmNlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbSAnc291cmNlJyBzaG91bGQgbm90IGJlIG51bGwuIik7DQotCQl9DQotDQotCQlpZiAoZ2V0VGVzdFByb2plY3QoKSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicHJvamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIGNsYXNzZXMgY2FuIGJlIGFkZGVkIHRvIGl0Iik7DQotCQl9DQotDQotCQlyZXR1cm4gZ2V0VGVzdFByb2plY3QoKS5jcmVhdGVUeXBlKHBjaywgY2xhc3NOYW1lICsgSkFWQV9FWFQsIHNvdXJjZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlYWRzIHRoZSBjb250ZW50IG9mIDxjb2RlPnNvdXJjZXNGaWxlUGF0aDwvY29kZT4gYW5kIGNyZWF0ZXMgY2xhc3NlcyBpbiB0ZXN0IHByb2plY3QuIFRoZSBjb250ZW50IG9mIDxjb2RlPnNvdXJjZXNGaWxlUGF0aDwvY29kZT4gc291bGQgYmUgLQ0KLQkgKiAnIycgY2hhciAoc2VwYXJhdG9yIGZvciBjbGFzc2VzKSBmb2xsb3dlZCBieSBDbGFzcyBuYW1lLCBuZXcgbGluZSBhbmQgYWZ0ZXIgdGhhdCBjbGFzcyBzb3VyY2Ugd2l0aG91dCBwYWNrYWdlIGRlY2xhcmF0aW9uLjxicj4NCi0JICogRXhhbXBsZToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICAjSW1wbGVtZW50c1JlbW90ZQ0KLQkgKiAgcHVibGljIGNsYXNzIEltcGxlbWVudHNSZW1vdGUgaW1wbGVtZW50cyBqYXZhLnJtaS5SZW1vdGUNCi0JICogIHsNCi0JICogIH0NCi0JICogCQ0KLQkgKiAgI05vRGVmYXVsdENvbnN0cnVjdG9yDQotCSAqICBwdWJsaWMgY2xhc3MgTm9EZWZhdWx0Q29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQ0KLQkgKiAgew0KLQkgKiAJcHVibGljIE5vRGVmYXVsdENvbnN0cnVjdG9yKFN0cmluZyBwYXJhbSkgew0KLQkgKiAgCX0NCi0JICogIH0NCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgaWYgbG90cyBvZiBzbWFsbCBjbGFzc2VzIHNob3VsZCBiZSBjcmVhdGVkIGZyb20gYSBzb3VyY2UgZmlsZS4gUHJvamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VzRmlsZVBhdGgNCi0JICogQHJldHVybiBtYXAgb2YgY2xhc3NOYW1lLT5JVHlwZS4gdGhhdCBoYXZlIGJlZW4gY3JlYXRlZA0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElUeXBlPiBjcmVhdGVDbGFzc2VzKFN0cmluZyBzb3VyY2VzRmlsZVBhdGgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJTWFwPFN0cmluZywgSVR5cGU+IHR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJVHlwZT4oKTsNCi0JCVN0cmluZyBzb3VyY2UgPSBUZXN0UHJvamVjdHNVdGlscy5yZWFkU291cmNlKHRoaXMuZ2V0Q2xhc3MoKSwgc291cmNlc0ZpbGVQYXRoKTsNCi0NCi0JCWludCBzdGFydFBvcyA9IDA7DQotCQl3aGlsZSAoKHN0YXJ0UG9zID0gc291cmNlLmluZGV4T2YoU0VQQVJBVE9SKSkgPiAtMSkNCi0JCXsNCi0JCQlpbnQgZW5kUG9zID0gc291cmNlLmluZGV4T2YoU0VQQVJBVE9SLCBzdGFydFBvcyArIDEpOw0KLQkJCWlmIChlbmRQb3MgPT0gLTEpDQotCQkJCWVuZFBvcyA9IHNvdXJjZS5sZW5ndGgoKTsNCi0NCi0JCQlTdHJpbmcgc3JjID0gc291cmNlLnN1YnN0cmluZyhzdGFydFBvcyArIDEsIGVuZFBvcyk7DQotCQkJc291cmNlID0gc291cmNlLnN1YnN0cmluZyhlbmRQb3MpOw0KLQ0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSBzcmMuc3Vic3RyaW5nKDAsIHNyYy5pbmRleE9mKCdcbicpKS5yZXBsYWNlQWxsKCJcciIsICIiKTsNCi0JCQlzcmMgPSBzcmMuc3Vic3RyaW5nKHNyYy5pbmRleE9mKCdcbicpICsgMSk7DQotDQotCQkJdHlwZXMucHV0KGNsYXNzTmFtZSwgY3JlYXRlQ2xhc3MoZGVmYXVsdFBhY2thZ2UsIGNsYXNzTmFtZSwgc3JjKSk7DQotCQl9DQotDQotCQlyZXR1cm4gdHlwZXM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Byb2plY3RCYXNlZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9Qcm9qZWN0QmFzZWRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ0ZTA4OTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Byb2plY3RCYXNlZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi0NCi0vKioNCi0gKiBHZW5lcmFsIGNsYXNzIGZvciB0ZXN0cyB0aGF0IHNob3VsZCBiZSBzdGFydGVkIGFzIEpVbml0IFBsdWdpbiB0ZXN0cy4gUHJvdmlkZXMgYmFzaWMgZnVuY3Rpb25hbGl0aWVzIGZvciBmdW5jdGlvbmFsIHRlc3Rpbmc6IDEuIENyZWF0ZSBKYXZhIHByb2plY3QNCi0gKiBpbiBqdW5pdC1ydW50aW1lLXdvcmtiZW5jaC4gMi4gQ3JlYXRlIGRlZmF1bHQgc291cmNlIGZvbGRlci4gMy4gQ3JlYXRlIGRlZmF1bHQgcGFja2FnZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RCYXNlZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBUZXN0UHJvamVjdCBwcm9qZWN0Ow0KLQ0KLQkvKioNCi0JICogPGNvZGU+c3JjRm9sZGVyTmFtZTwvY29kZT4gdGhlIHNvdXJjZSBmb2xkZXIgd2hlcmUgY2xhc3NlcyB3aWxsIGJlIGNyZWF0ZWQsIDxjb2RlPnBhY2thZ2VOYW1lPC9jb2RlPiBpcyB0aGUgcGFja2FnZSB3aGVyZSBjbGFzc2VzIHdpbGwgYmUNCi0JICogY3JlYXRlZC4NCi0JICogDQotCSAqIEBwYXJhbSBzcmNGb2xkZXJOYW1lDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIC0NCi0JICogICAgICAgICAgICAgaW4gY2FzZSBzcmNGb2xkZXJOYW1lIGlzIG51bGwNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBzcmNGb2xkZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoc3JjRm9sZGVyTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigic3JjRm9sZGVyTmFtZSBzaG91bGQgbm90IGJlIG51bGwuIik7DQotCQl9DQotDQotCQlwcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KCk7DQotCQlwcm9qZWN0LmNyZWF0ZVNvdXJjZUZvbGRlcihzcmNGb2xkZXJOYW1lKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpDQotCQl7DQotCQkJcHJvamVjdC5kaXNwb3NlKCk7DQotCQl9DQotCX0NCi0NCi0JcHJvdGVjdGVkIGZpbmFsIFRlc3RQcm9qZWN0IGdldFRlc3RQcm9qZWN0KCkNCi0Jew0KLQkJcmV0dXJuIHByb2plY3Q7DQotCX0NCi0NCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFNvdXJjZUZvbGRlcigpDQotCXsNCi0JCXJldHVybiBwcm9qZWN0LmdldFNvdXJjZUZvbGRlcigpOw0KLQl9DQotDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKQ0KLQl7DQotCQlyZXR1cm4gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0RWpiM1Byb2plY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0RWpiM1Byb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTBhNzliNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdEVqYjNQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3Q7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmV4Y2VwdGlvbi5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIFRlc3RFamIzUHJvamVjdA0KLXsNCi0JcHJpdmF0ZSBJUHJvamVjdCBlamJQcm9qZWN0Ow0KLQ0KLQlwdWJsaWMgVGVzdEVqYjNQcm9qZWN0KGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWVqYlByb2plY3QgPSBjcmVhdGVFamJNb2R1bGUobmFtZSArICJfIiArIExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsNCi0JfQ0KLQkNCi0JcHVibGljIFRlc3RFamIzUHJvamVjdChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgYm9vbGVhbiBhcHBlbmRVaWQsIGZpbmFsIGJvb2xlYW4gcmV1c2VFeGlzdGluZykgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHByb2plY3ROYW1lID0gbmV3IFN0cmluZ0J1aWxkZXIobmFtZSk7DQotCQlpZiAoYXBwZW5kVWlkKQ0KLQkJew0KLQkJCXByb2plY3ROYW1lLmFwcGVuZCgiXyIpOw0KLQkJCXByb2plY3ROYW1lLmFwcGVuZChMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7DQotCQl9DQotCQlJUHJvamVjdCBleGlzdGluZ1Byb2plY3QgPSBudWxsOw0KLQkJaWYgKHJldXNlRXhpc3RpbmcpDQotCQl7DQotCQkJZXhpc3RpbmdQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lLnRvU3RyaW5nKCkpOw0KLQkJfQ0KLQkJaWYgKGV4aXN0aW5nUHJvamVjdCA9PSBudWxsKQ0KLQkJew0KLQkJCXRoaXMuZWpiUHJvamVjdCA9IGNyZWF0ZUVqYk1vZHVsZShwcm9qZWN0TmFtZS50b1N0cmluZygpKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXRoaXMuZWpiUHJvamVjdCA9IGV4aXN0aW5nUHJvamVjdDsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJUHJvamVjdCBjcmVhdGVFamJNb2R1bGUoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gew0KLQkJcmV0dXJuIFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KG5hbWUpOw0KLQl9DQotDQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkNCi0Jew0KLQkJcmV0dXJuIGVqYlByb2plY3QuZ2V0UHJvamVjdCgpOw0KLQl9DQotDQotCXB1YmxpYyBJRm9sZGVyIGdldE1ldGFJbmZGb2xkZXIoKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBlamJQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoImVqYk1vZHVsZSIpLmdldEZvbGRlcigiTUVUQS1JTkYiKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBjcmVhdGVQYWNrYWdlKFN0cmluZyBzb3VyY2VGb2xkZXIsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZ2V0UHJvamVjdCgpKTsNCi0JCWZpbmFsIElGb2xkZXIgZm9sZGVyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihzb3VyY2VGb2xkZXIpOw0KLQkJZmluYWwgSVBhY2thZ2VGcmFnbWVudFJvb3Qgc3JjRm9sZGVyID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChmb2xkZXIpOw0KLQkJcmV0dXJuIHNyY0ZvbGRlci5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUZpbGUgY3JlYXRlRmlsZShmaW5hbCBJRm9sZGVyIGZvbGRlciwgZmluYWwgU3RyaW5nIGZpbGVOYW1lLCBmaW5hbCBVUkwgaW5wdXRVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZm9sZGVyLCAiZm9sZGVyIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmlsZU5hbWUsICJmaWxlTmFtZSIpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGlucHV0VXJsLCAiaW5wdXRVcmwiKTsNCi0JCQ0KLQkJZmluYWwgSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGZpbGVOYW1lKTsNCi0JCWZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaW5wdXRVcmwub3BlblN0cmVhbSgpOw0KLQkJdHJ5DQotCQl7DQotCQkJZmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JCQlyZXR1cm4gZmlsZTsNCi0JCX0NCi0JCWZpbmFsbHkNCi0JCXsNCi0JCQlpbnB1dFN0cmVhbS5jbG9zZSgpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogVG8gZ2V0IGEgaGFuZGxlIHRvIGEgZmlsZSBsb2NhdGVkIGluIHRoaXMgcHJvamVjdCBzcGVjaWZpZWQgYnkgdGhlIHJlbGF0aXZlIGZpbGUgcGF0aC4NCi0JICogQHBhcmFtIGZpbGVQYXRoIGZpbGUgcGF0aCByZWxhdGl2ZSBpbnNpZGUgb2YgdGhlIHByb2plY3QsIGkuZS4gdGhlIHByb2plY3QgbmFtZSBtdXN0IE5PVA0KLQkgKiAgYmUgcGFydCBvZiB0aGUgcGF0aCANCi0JICogQHJldHVybiB0aGUgZmlsZSBoYW5kbGUgKi8NCi0JcHVibGljIGZpbmFsIElGaWxlIGdldEZpbGUoZmluYWwgU3RyaW5nIGZpbGVQYXRoKQ0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmlsZVBhdGgsICJmaWxlUGF0aCIpOw0KLQkJcmV0dXJuIHRoaXMuZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShmaWxlUGF0aCk7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIHZvaWQgZGVsZXRlRmlsZShmaW5hbCBJRm9sZGVyIGZvbGRlciwgZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZvbGRlciwgImZvbGRlciIpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZpbGVOYW1lLCAiZmlsZU5hbWUiKTsNCi0JCQ0KLQkJZmluYWwgSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGZpbGVOYW1lKTsNCi0JCWlmIChmaWxlLmV4aXN0cygpKQ0KLQkJew0KLQkJCWZpbGUuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogVG8gY3JlYXRlIGEgcHJvamVjdCBmb2xkZXIgc3BlY2lmaWVkIGJ5IHRoZSByZWxhdGl2ZSBmb2xkZXIgcGF0aC4gQWxsIGZvbGRlciBzZWdtZW50cw0KLQkgKiBoYXZlIGFscmVhZHkgdG8gZXhpc3QgYXBhcnQgZnJvbSB0aGUgbGFzdCBvbmUsIGkuZS4gcGFyZW50IGZvbGRlcnMgYXJlIG5vdCBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuDQotCSAqIEBwYXJhbSBmb2xkZXJQYXRoIGZvbGRlciBwYXRoIHJlbGF0aXZlIGluc2lkZSBvZiB0aGUgcHJvamVjdCwgaS5lLiB0aGUgcHJvamVjdCBuYW1lIG11c3QgTk9UDQotCSAqICBiZSBwYXJ0IG9mIHRoZSBwYXRoIA0KLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGZvbGRlcg0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gKi8NCi0JcHVibGljIGZpbmFsIElGb2xkZXIgY3JlYXRlRm9sZGVyKGZpbmFsIFN0cmluZyBmb2xkZXJQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZm9sZGVyUGF0aCwgImZvbGRlclBhdGgiKTsNCi0JCQ0KLQkJZmluYWwgSUZvbGRlciBmb2xkZXIgPSB0aGlzLmVqYlByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZvbGRlcihmb2xkZXJQYXRoKTsNCi0JCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7DQotCQlyZXR1cm4gZm9sZGVyOw0KLQl9DQotDQotCS8qKiBUbyBnZXQgYSBoYW5kbGUgdG8gYSBwcm9qZWN0IGZvbGRlciBzcGVjaWZpZWQgYnkgdGhlIHJlbGF0aXZlIGZvbGRlciBwYXRoLg0KLQkgKiBAcGFyYW0gZm9sZGVyUGF0aCBmb2xkZXIgcGF0aCByZWxhdGl2ZSBpbnNpZGUgb2YgdGhlIHByb2plY3QsIGkuZS4gdGhlIHByb2plY3QgbmFtZSBtdXN0IE5PVA0KLQkgKiAgYmUgcGFydCBvZiB0aGUgcGF0aCANCi0JICogQHJldHVybiB0aGUgZm9sZGVyIGhhbmRsZSAqLw0KLQlwdWJsaWMgZmluYWwgSUZvbGRlciBnZXRGb2xkZXIoZmluYWwgU3RyaW5nIGZvbGRlclBhdGgpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXJQYXRoLCAiZm9sZGVyUGF0aCIpOw0KLQkJcmV0dXJuIHRoaXMuZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKGZvbGRlclBhdGgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0UHJvamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAyMDc1OGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3Q7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsNCi0NCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQ0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdA0KLXsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIENMQVNTX1NFUEFSQVRPUiA9ICcjJzsNCi0JDQotCXByaXZhdGUgaW50IGlkSW5NaWxsaXMgPSAwOw0KLQkNCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0Ow0KLQ0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsNCi0NCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VGb2xkZXI7DQotDQotCXB1YmxpYyBUZXN0UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXRoaXMoIiIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgVGVzdFByb2plY3QoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOw0KLQkJLyoNCi0JCSAqIENhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBwcm9qZWN0LiBUaGUgZm9ybXVsYTogSmF2YVByb2pfICsgPGN1cnJlbnRfdGltZV9pbl9taWxsaXM/ICsgPGlkSW5NaWxsaXM+IGlzIHVzc2VkLiBJbiB0aGlzIGZvcm11bGENCi0JCSAqIEphdmFQcm9qXyBpcyBhIHN0cmluZyBsaXR0ZXJhbCwgY3VycmVudF90aW1lX2luX21pbGxpcyBpcyBvYnZpb3VzLiBpZEluTWlsbGlzIGlzIGFuIGludGVnZXIgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgcHJvamVjdCBuYW1lIGlzDQotCQkgKiBjYWxjdWxhdGVkLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBzeXN0ZW0gdGltZXIgaGFzIHByZWNpc2lvbiBhYm91dCAxMCBtcy4gVGh1cyBpdCdzIHBvc3NpYmxlIHRoYXQgdHdvIGNvbnNlY3V0aXZlIHByb2plY3QgY3JlYXRpb25zDQotCQkgKiBnaXZlIHRoZSBzYW1lIHByb2plY3QgbmFtZS4gRm9yIGV4YW1wbGUgdGhlIHByb2plY3QgaXMgY3JldGVkIHRoZW4gdGhlIHRlc3QgZXhlY3V0ZXMgdmVyeSBmYXN0IGFuZCBhIG5ldyBwcm9qZWN0IGlzIGNyZWF0ZWQgYWdhaW4uIEluIHRoZQ0KLQkJICogc2FtZSB0aW1lIHNpbXBseSB0aGUgaWQgaXMgbm90IGVub3VnaCBhcyBhIGRpZmZlcmVudCB0ZXN0IHJ1biBtaWdodCBwcm9kdWNlIHRoZSBzYW1lIHByb2plY3QgbmFtZS4gVGh1cyB0aGUgY29tYmluYXRpb24gdGltX21pbGxpcyArDQotCQkgKiBpZEluTWlsbGlzIGdpdmVzIGEgdW5pcXVlIHByb2plY3QgbmFtZQ0KLQkJICovDQotCQlmaW5hbCBTdHJpbmcgdGVzdFByb2plY3ROYW1lID0gIkphdmFQcm9qXyIgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSArICJfIiArIGlkSW5NaWxsaXMrKyArIG5hbWU7DQotCQlwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHRlc3RQcm9qZWN0TmFtZSk7DQotCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsNCi0JCXByb2plY3Qub3BlbihudWxsKTsNCi0NCi0JCWNvbmZpZ3VyZUphdmFQcm9qZWN0KCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUphdmFQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7DQotDQotCQlJRm9sZGVyIGJpbkZvbGRlciA9IGNyZWF0ZUJpbkZvbGRlcigpOw0KLQ0KLQkJc2V0SmF2YU5hdHVyZSgpOw0KLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0sIG51bGwpOw0KLQ0KLQkJY3JlYXRlT3V0cHV0Rm9sZGVyKGJpbkZvbGRlcik7DQotCQlhZGRTeXN0ZW1MaWJyYXJpZXMoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgVGVzdFByb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInByb2plY3Qgc2hvdWxkIG5vdCBiZSBudWxsIik7DQotCQl9DQotDQotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0Ow0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JCXRoaXMuc291cmNlRm9sZGVyID0gZmluZFNvdXJjZUZvbGRlcigpOw0KLQl9DQotDQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZmluZFNvdXJjZUZvbGRlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIgOiBqYXZhUHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpKQ0KLQkJew0KLQkJCWlmIChwZnIuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHBmcjsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpDQotCXsNCi0JCXJldHVybiBwcm9qZWN0Ow0KLQl9DQotDQotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKQ0KLQl7DQotCQlyZXR1cm4gamF2YVByb2plY3Q7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkSmFyKFN0cmluZyBwbHVnaW4sIFN0cmluZyBqYXIpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJUGF0aCByZXN1bHQgPSBmaW5kRmlsZUluUGx1Z2luKHBsdWdpbiwgamFyKTsNCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsNCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoICsgMV07DQotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsNCi0JCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHJlc3VsdCwgbnVsbCwgbnVsbCk7DQotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbnVsbCk7DQotCQkNCi0JCVN0cmluZyBsb2cgPSAiXG4iK2phdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkrIlxuIitTdHJpbmcudmFsdWVPZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGgpKyJcbiI7IA0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaSA8IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlsb2cgPSBsb2cgKyAgamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKClbaWldLmdldFBhdGgoKS50b1N0cmluZygpKyJcbiI7DQotCQl9DQotCQkNCi0JCWlmKGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmxlbmd0aD09MCkNCi0JCXsNCi0JCQlsb2cgPSBsb2cgKyAiQ2xhc3NwYXRoIG5vdCBpbml0aWFsaXplZCAhXG4iOw0KLQkJfQ0KLQkJDQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoMCwidGVzdE91dHB1dCIsbG9nKSk7DQotCX0NCi0NCi0JcHVibGljIElQYWNrYWdlRnJhZ21lbnQgY3JlYXRlUGFja2FnZShTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHNvdXJjZUZvbGRlciA9PSBudWxsKQ0KLQkJCXNvdXJjZUZvbGRlciA9IGNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7DQotCQlyZXR1cm4gc291cmNlRm9sZGVyLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChuYW1lLCBmYWxzZSwgbnVsbCk7DQotCX0NCi0NCi0JcHVibGljIElUeXBlIGNyZWF0ZVR5cGUoSVBhY2thZ2VGcmFnbWVudCBwYWNrLCBTdHJpbmcgY3VOYW1lLCBTdHJpbmcgc291cmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCQlidWYuYXBwZW5kKCJwYWNrYWdlICIgKyBwYWNrLmdldEVsZW1lbnROYW1lKCkgKyAiO1xuIik7DQotCQlidWYuYXBwZW5kKCJcbiIpOw0KLQkJYnVmLmFwcGVuZChzb3VyY2UpOw0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHBhY2suY3JlYXRlQ29tcGlsYXRpb25Vbml0KGN1TmFtZSwgYnVmLnRvU3RyaW5nKCksIGZhbHNlLCBudWxsKTsNCi0JCXJldHVybiBjdS5nZXRUeXBlcygpWzBdOw0KLQl9DQotDQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBtdWx0aXBsZSBjbGFzc2VzIGluIHByb2plY3QuIFRoZSBjb250ZW50IG9mIDxjb2RlPnNvdXJjZTwvY29kZT4gc2hvdWxkIGJlIGluIGZvcm0gLQ0KLQkgKiAnIycgY2hhciAoc2VwYXJhdG9yIGZvciBjbGFzc2VzKSBmb2xsb3dlZCBieSBDbGFzcyBuYW1lLCBuZXcgbGluZSBhbmQgYWZ0ZXIgdGhhdCBjbGFzcyBzb3VyY2Ugd2l0aG91dCBwYWNrYWdlIGRlY2xhcmF0aW9uLjxicj4NCi0JICogRXhhbXBsZToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICAjSW1wbGVtZW50c1JlbW90ZQ0KLQkgKiAgcHVibGljIGNsYXNzIEltcGxlbWVudHNSZW1vdGUgaW1wbGVtZW50cyBqYXZhLnJtaS5SZW1vdGUNCi0JICogIHsNCi0JICogIH0NCi0JICogCQ0KLQkgKiAgI05vRGVmYXVsdENvbnN0cnVjdG9yDQotCSAqICBwdWJsaWMgY2xhc3MgTm9EZWZhdWx0Q29uc3RydWN0b3IgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQ0KLQkgKiAgew0KLQkgKiAJcHVibGljIE5vRGVmYXVsdENvbnN0cnVjdG9yKFN0cmluZyBwYXJhbSkgew0KLQkgKiAgCX0NCi0JICogIH0NCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgaWYgbG90cyBvZiBzbWFsbCBjbGFzc2VzIHNob3VsZCBiZSBjcmVhdGVkIGZyb20gYSBzb3VyY2UgZmlsZS4NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VzRmlsZVBhdGgNCi0JICogQHJldHVybiBtYXAgb2YgY2xhc3NOYW1lLT5JVHlwZS4gdGhhdCBoYXZlIGJlZW4gY3JlYXRlZA0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIE1hcDxTdHJpbmcsIElUeXBlPiBjcmVhdGVUeXBlcyhJUGFja2FnZUZyYWdtZW50IHBhY2ssIFN0cmluZyBzb3VyY2UpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJTWFwPFN0cmluZywgSVR5cGU+IHR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJVHlwZT4oKTsNCi0JCWludCBzdGFydFBvcyA9IDA7DQotCQl3aGlsZSAoKHN0YXJ0UG9zID0gc291cmNlLmluZGV4T2YoQ0xBU1NfU0VQQVJBVE9SKSkgPiAtMSkNCi0JCXsNCi0JCQlpbnQgZW5kUG9zID0gc291cmNlLmluZGV4T2YoQ0xBU1NfU0VQQVJBVE9SLCBzdGFydFBvcyArIDEpOw0KLQkJCWlmIChlbmRQb3MgPT0gLTEpIHsNCi0JCQkJZW5kUG9zID0gc291cmNlLmxlbmd0aCgpOw0KLQkJCX0NCi0NCi0JCQlTdHJpbmcgc3JjID0gc291cmNlLnN1YnN0cmluZyhzdGFydFBvcyArIDEsIGVuZFBvcyk7DQotCQkJc291cmNlID0gc291cmNlLnN1YnN0cmluZyhlbmRQb3MpOw0KLQ0KLQkJCVN0cmluZyBjbGFzc05hbWUgPSBzcmMuc3Vic3RyaW5nKDAsIHNyYy5pbmRleE9mKCdcbicpKS5yZXBsYWNlQWxsKCJcciIsICIiKS50cmltKCk7DQotCQkJc3JjID0gc3JjLnN1YnN0cmluZyhzcmMuaW5kZXhPZignXG4nKSArIDEpOw0KLQ0KLQkJCXR5cGVzLnB1dChjbGFzc05hbWUsIGNyZWF0ZVR5cGUocGFjaywgY2xhc3NOYW1lICsgIi5qYXZhIiwgc3JjKSk7DQotCQl9DQotDQotCQlyZXR1cm4gdHlwZXM7DQotCX0JCQ0KLQkNCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUpvYlV0aWxzLndhaXRGb3JKb2JzKCk7DQotCQl0cnkgew0KLQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7DQotCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7DQotCQl9IGNhdGNoIChSZXNvdXJjZUV4Y2VwdGlvbiByZSkgew0KLQkJCS8qDQotCQkJICogc2lsZW50bHkgc3dhbGxvdyB0aGUgcmVzb3VyY2UgZXhjZXB0aW9uLiBGb3Igc29tZSByZWFzb24gdGhpcyBleGNlcHRpb24gZ2V0cyB0aHJvd24NCi0JCQkgKiBmcm9tIHRpbWUgdG8gdGltZSBhbmQgcmVwb3J0cyB0aGUgdGVzdCBmYWlsaW5nLiBUaGUgcHJvamVjdCBkZWxldGlvbiBpdHNlbGYgaGFwcGVucw0KLQkJCSAqIGFmdGVyIHRoZSB0ZXN0IGhhcyBjb21wbGV0ZWQgYW5kIGEgZmFpbHVyZSB3aWxsIG5vdCByZXBvcnQgYSBwcm9ibGVtIGluIHRoZSB0ZXN0Lg0KLQkgICAgCSAqIE9ubHkgUmVzb3VyY2VFeGNlcHRpb24gaXMgY2F1Z2h0IGluIG9yZGVyIG5vdCB0byBoaWRlIHVuZXhwZWN0ZWQgZXJyb3JzLgkNCi0JCQkgKi8NCi0JCQlyZXR1cm47DQotCQl9DQotCX0NCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOw0KLQkJDQotCQlwcm9qZWN0LmNsb3NlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwkJDQotCX0NCi0NCi0JcHJpdmF0ZSBJRm9sZGVyIGNyZWF0ZUJpbkZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUlGb2xkZXIgYmluRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoImJpbiIpOw0KLQkJYmluRm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7DQotCQlyZXR1cm4gYmluRm9sZGVyOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBzZXRKYXZhTmF0dXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsNCi0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXcgU3RyaW5nW10geyBKYXZhQ29yZS5OQVRVUkVfSUQgfSk7DQotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY3JlYXRlT3V0cHV0Rm9sZGVyKElGb2xkZXIgYmluRm9sZGVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUlQYXRoIG91dHB1dExvY2F0aW9uID0gYmluRm9sZGVyLmdldEZ1bGxQYXRoKCk7DQotCQlqYXZhUHJvamVjdC5zZXRPdXRwdXRMb2NhdGlvbihvdXRwdXRMb2NhdGlvbiwgbnVsbCk7DQotCX0NCi0NCi0JcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290IGNyZWF0ZVNvdXJjZUZvbGRlcihTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihuYW1lKTsNCi0JCWZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOw0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZm9sZGVyKTsNCi0NCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsNCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoICsgMV07DQotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsNCi0JCW5ld0VudHJpZXNbb2xkRW50cmllcy5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkocm9vdC5nZXRQYXRoKCkpOw0KLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOw0KLQkJdGhpcy5zb3VyY2VGb2xkZXIgPSByb290Ow0KLQkJDQotCQlTdHJpbmcgbG9nID0gIlxuIitqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKyJcbiIrU3RyaW5nLnZhbHVlT2YoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkubGVuZ3RoKSsiXG4iOyANCi0NCi0JCWZvcihpbnQgaWk9MDsgaWkgPCBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJbG9nID0gbG9nICsgIGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpW2lpXS5nZXRQYXRoKCkudG9TdHJpbmcoKSsiXG4iOw0KLQkJfQ0KLQkJDQotCQlpZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg9PTApDQotCQl7DQotCQkJbG9nID0gbG9nICsgIkNsYXNzcGF0aCBub3QgaW5pdGlhbGl6ZWQgIVxuIjsNCi0JCX0NCi0JCQ0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKDAsInRlc3RPdXRwdXQiLGxvZykpOw0KLQkJDQotCQlyZXR1cm4gcm9vdDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgYWRkU3lzdGVtTGlicmFyaWVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOw0KLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7DQotCQluZXdFbnRyaWVzW29sZEVudHJpZXMubGVuZ3RoXSA9IEphdmFSdW50aW1lLmdldERlZmF1bHRKUkVDb250YWluZXJFbnRyeSgpOw0KLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMsIG51bGwpOw0KLQkJDQotCQlTdHJpbmcgbG9nID0gIlxuIitqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKyJcbiIrU3RyaW5nLnZhbHVlT2YoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkubGVuZ3RoKSsiXG4iOyANCi0NCi0JCWZvcihpbnQgaWk9MDsgaWkgPCBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJbG9nID0gbG9nICsgIGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpW2lpXS5nZXRQYXRoKCkudG9TdHJpbmcoKSsiXG4iOw0KLQkJfQ0KLQkJDQotCQlpZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg9PTApDQotCQl7DQotCQkJbG9nID0gbG9nICsgIkNsYXNzcGF0aCBub3QgaW5pdGlhbGl6ZWQgIVxuIjsNCi0JCX0NCi0JCQ0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKDAsInRlc3RPdXRwdXQiLGxvZykpOw0KLQl9DQotDQotCXByaXZhdGUgUGF0aCBmaW5kRmlsZUluUGx1Z2luKFN0cmluZyBwbHVnaW4sIFN0cmluZyBmaWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbg0KLQl7DQotCQlCdW5kbGUgcGx1Z2luQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbik7DQotCQlVUkwgamFyVVJMID0gbmV3IFVSTChwbHVnaW5CdW5kbGUuZ2V0RW50cnkoIi8iKSwgZmlsZSk7DQotCQlVUkwgbG9jYWxKYXJVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoamFyVVJMKTsNCi0JCXJldHVybiBuZXcgUGF0aChsb2NhbEphclVSTC5nZXRQYXRoKCkpOw0KLQl9DQotDQotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRTb3VyY2VGb2xkZXIoKQ0KLQl7DQotCQlyZXR1cm4gc291cmNlRm9sZGVyOw0KLQl9DQotCQ0KLQkvKioNCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGNvbnRhaW5lciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QsIGkuZS4gdGhlIHNvdXJjZSBmb2xkZXIuPGJyPg0KLQkgKiBJZiB0aGlzIHByb2plY3QgaXMgYSBqYXIvemlwIChpZiB0aGlzIGlzIHBvc3NpYmxlIGF0IGFsbCksIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbC4NCi0JICovDQotCXB1YmxpYyBJQ29udGFpbmVyIGdldFNvdXJjZUZvbGRlckNvbnRhaW5lcigpDQotCXsNCi0JCXRyeXsNCi0JCQlJUmVzb3VyY2UgcmVzID0gZ2V0U291cmNlRm9sZGVyKCkuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7DQotCQkJaWYocmVzPT1udWxsKSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX1lbHNlIHsNCi0JCQkJSUNvbnRhaW5lciByZXRWYWwgPSAoSUNvbnRhaW5lcikgcmVzOw0KLQkJCQlyZXR1cm4gcmV0VmFsOw0KLQkJCX0NCi0JCX1jYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX1jYXRjaChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgSUZvbGRlciBjcmVhdGVGb2xkZXIoZmluYWwgU3RyaW5nIGZvbGRlck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXJOYW1lLCAiZm9sZGVyTmFtZSIpOw0KLQkJZmluYWwgSUZvbGRlciBmb2xkZXIgPSB0aGlzLnByb2plY3QuZ2V0Rm9sZGVyKGZvbGRlck5hbWUpOw0KLQkJZm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7DQotCQlyZXR1cm4gZm9sZGVyOwkJDQotCX0NCi0JDQotCS8qKg0KLQkgKiBTZXQgdGhlIHByb2plY3Qgcm9vdCBhcyBzb3VyY2UgZm9sZGVyDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYXNzaWduUHJvamVjdFJvb3RBc1NvdXJjZUZvbGRlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSUNsYXNzcGF0aEVudHJ5IGRlZmF1bHRTcmNGb2xkZXJFbnRyeSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRDcCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOw0KLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q3AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENwLmxlbmd0aCArIDFdOw0KLQkJU3lzdGVtLmFycmF5Y29weShvbGRDcCwgMCwgbmV3Q3AsIDAsIG9sZENwLmxlbmd0aCk7DQotCQluZXdDcFtuZXdDcC5sZW5ndGggLSAxXSA9IGRlZmF1bHRTcmNGb2xkZXJFbnRyeTsNCi0JCQ0KLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NwLCBudWxsKTsNCi0JCXRoaXMuc291cmNlRm9sZGVyID0gIFRlc3RQcm9qZWN0c1V0aWxzLmdldFNvdXJjZUZvbGRlcihwcm9qZWN0LCAiIik7DQotCQkNCi0JCVN0cmluZyBsb2cgPSAiXG4iK2phdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkrIlxuIitTdHJpbmcudmFsdWVPZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGgpKyJcbiI7IA0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaSA8IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlsb2cgPSBsb2cgKyAgamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKClbaWldLmdldFBhdGgoKS50b1N0cmluZygpKyJcbiI7DQotCQl9DQotCQkNCi0JCWlmKGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmxlbmd0aD09MCkNCi0JCXsNCi0JCQlsb2cgPSBsb2cgKyAiQ2xhc3NwYXRoIG5vdCBpbml0aWFsaXplZCAhXG4iOw0KLQkJfQ0KLQkJDQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoMCwidGVzdE91dHB1dCIsbG9nKSk7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RQcm9qZWN0c1V0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3RzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJiMzM4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3RzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdDsNCi0NCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZVJlcXVlc3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLkpvYlV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZy5UZXN0Q29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdHNVdGlscw0KLXsNCi0JLyoqDQotCSAqIFJlYWRzIGNvbnRlbnQgb2YgdGV4dCBmaWxlIGFuZCByZXR1cm5zIGl0IGFzIFN0cmluZy4NCi0JICogDQotCSAqIEBwYXJhbSBjbGFzcyBjb250ZXh0DQotCSAqIEBwYXJhbSBuYW1lDQotCSAqIEByZXR1cm4NCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZFNvdXJjZShDbGFzczw/PiBjbGFzc0NvbnRleHQsIFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCUlucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjbGFzc0NvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlUGF0aCkpOw0KLQkJdHJ5DQotCQl7DQotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJCWNoYXJbXSBidWZmID0gbmV3IGNoYXJbNTEyXTsNCi0NCi0JCQlpbnQgbGVuID0gMDsNCi0JCQl3aGlsZSAoKGxlbiA9IGlzci5yZWFkKGJ1ZmYpKSA+IDApDQotCQkJew0KLQkJCQlzYi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoYnVmZiwgMCwgbGVuKSk7DQotCQkJfQ0KLQ0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOw0KLQ0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJaXNyLmNsb3NlKCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFN0YXJ0cyBhbiBpbmRleGVyIGpvYi4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCB3b3JrYmVuY2ggcmVmcmVzaC9idWlsZCBwcm9jZXNzZXMgYXJlIG92ZXIgDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckluZGV4ZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2hBbGxUeXBlTmFtZXMobnVsbCwgU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENILCANCi0JCQkJCQkJCQkJCSAgbnVsbCwgU2VhcmNoUGF0dGVybi5SX0NBU0VfU0VOU0lUSVZFLCANCi0JCQkJCQkJCQkJCSAgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1MsIA0KLQkJCQkJCQkJCQkJICBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbMF0pLCBuZXcgVHlwZU5hbWVSZXF1ZXN0b3IoKQ0KLQkJCQkJCQkJCQkJICB7DQotCQkJCQkJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJCQkJCQkJCQkJcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywNCi0JCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQ0KLQkJCQkJCQkJCQkJCQl7DQotCQkJCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywNCi0JCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQ0KLQkJCQkJCQkJCQkJCQl7DQotCQkJCQkJCQkJCQkJCX0NCi0JCQkJCQkJCQkJCSAgfSwNCi0JCQkJCQkJCQkJCSAgSUphdmFTZWFyY2hDb25zdGFudHMuV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0gsIG51bGwpOw0KLQl9DQotDQotCQ0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7DQotCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsNCi0JCXByb2plY3Qub3BlbihudWxsKTsNCi0JCUpvYlV0aWxzLndhaXRGb3JJbmRleGVyKCk7DQotCQkNCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7DQotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1tdIHsgSmF2YUNvcmUuTkFUVVJFX0lEIH0pOw0KLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7DQotCQlJSmF2YVByb2plY3QgamF2YVAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7DQotCQlhZGRUb0NsYXNzcGF0aChqYXZhUCwgSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCkpOw0KLQ0KLQkJcmV0dXJuIHByb2plY3Q7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9DbGFzc3BhdGgoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7DQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOw0KLQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7DQotCQluZXdFbnRyaWVzW29sZEVudHJpZXMubGVuZ3RoXSA9IGNwRW50cnk7DQotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbnVsbCk7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRTb3VyY2VGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZvbGRlck5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOw0KLQkJZm9yKElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgOiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKQ0KLQkJew0KLQkJCWlmKHJvb3QuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZm9sZGVyTmFtZSkpDQotCQkJew0KLQkJCQlyZXR1cm4gcm9vdDsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIElQYWNrYWdlRnJhZ21lbnRSb290IGNyZWF0ZVNvdXJjZUZvbGRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYoZ2V0U291cmNlRm9sZGVyKHByb2plY3QsIGZvbGRlck5hbWUpICE9IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU291cmNlIGZvbGRlciBhbHJlYWR5IGV4aXN0czogIiArIGZvbGRlck5hbWUpOw0KLQkJfQ0KLQ0KLQkJSUZvbGRlciBzcmNGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihmb2xkZXJOYW1lKTsNCi0JCXNyY0ZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7DQotCQkNCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JCUlDbGFzc3BhdGhFbnRyeSBzcmNDcEVudHJ5ID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkoc3JjRm9sZGVyLmdldEZ1bGxQYXRoKCkubWFrZUFic29sdXRlKCkpOw0KLQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOw0KLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkRW50cmllcy5sZW5ndGggKyAxXTsgDQotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsNCi0JCW5ld0VudHJpZXNbbmV3RW50cmllcy5sZW5ndGggLSAxXSA9IHNyY0NwRW50cnk7DQotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbnVsbCk7DQotDQotCQlyZXR1cm4gZ2V0U291cmNlRm9sZGVyKHByb2plY3QsIGZvbGRlck5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbXBvcnRzIGEgZmlsZSBpbnRvIGEgcHJvamVjdA0KLQkgKiBAcGFyYW0gY2xhc3NDb250ZXh0IHRoZSBjbGFzcyB3aGljaCBjbGFzc2xvYWRlciBpcyB1c2VkIHRvIGdldCB0aGUgc291cmNlIHJlc291cmNlIA0KLQkgKiBAcGFyYW0gcmVsYXRpdmVTcmNGaWxlTG9jYXRpb24gc291cmNlIGZpbGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIDxjb2RlPmNsYXNzQ29udGV4dDwvY29kZT4gcGFyYW1ldGVyDQotCSAqIEBwYXJhbSB0YXJnZXRSZXNvdXJjZSB0aGUgdGFyZ2V0IHJlc291cmNlOyANCi0JICogQHBhcmFtIHRhcmdldEZpbGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGNyZWF0ZWQNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKiBAcmV0dXJucyB0aGUgZmlsZSBpbXBvcnRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBGaWxlIGltcG9ydEZpbGVJbnRvUHJvamVjdChDbGFzczw/PiBjbGFzc0NvbnRleHQsIFN0cmluZyByZWxhdGl2ZVNyY0ZpbGVMb2NhdGlvbiwgSUNvbnRhaW5lciB0YXJnZXRSZXNvdXJjZSwgU3RyaW5nIHRhcmdldEZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIHNyYyA9IFRlc3RQcm9qZWN0c1V0aWxzLnJlYWRTb3VyY2UoY2xhc3NDb250ZXh0LCByZWxhdGl2ZVNyY0ZpbGVMb2NhdGlvbik7DQotCQlGaWxlIGYgPSBuZXcgRmlsZSh0YXJnZXRSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSArICJcXCIgKyB0YXJnZXRGaWxlTmFtZSk7DQotCQkNCi0JCWlmKGYuZXhpc3RzKCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmlsZSBhbHJlYWR5IGV4aXN0czogIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLQkJfQ0KLQkJDQotCQlpZihmLmlzRGlyZWN0b3J5KCkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmLmdldEFic29sdXRlUGF0aCgpICsgIiBpcyBhIGRpcmVjdG9yeSIpOw0KLQkJfQ0KLQkJaWYoIGYuY3JlYXRlTmV3RmlsZSgpICkNCi0JCXsNCi0JCQlCdWZmZXJlZFdyaXRlciBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmKSkpOw0KLQkJCW91dC53cml0ZShzcmMpOw0KLQkJCW91dC5mbHVzaCgpOw0KLQkJCW91dC5jbG9zZSgpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZjsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVdvcmtzcGFjZVByb2plY3RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCWZvcihJUHJvamVjdCBwcm9qZWN0IDogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKQ0KLQkJew0KLQkJCXRyeQ0KLQkJCXsNCi0JCQkJcHJvamVjdC5kZWxldGUoZmFsc2UsIG1vbml0b3IpOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCQl7DQotCQkJCShuZXcgTG9nZ2VyKCkpLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCQl9DQotCQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZUVqYjNQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVByb2plY3QgZWpiUHJvamVjdCA9IGNyZWF0ZVByb2plY3RXaXRoRmFjZXQocHJvamVjdE5hbWUsIG5ldyBTdHJpbmdbXXsianN0LmphdmEiLCAianN0LmVqYiJ9LCBuZXcgU3RyaW5nW117IjUuMCIsICIzLjAifSk7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVAgPSBKYXZhQ29yZS5jcmVhdGUoZWpiUHJvamVjdCk7DQotCQkNCi0JCXJlbW92ZUFsbFNvdXJjZUZvbGRlcnMoamF2YVApOw0KLQ0KLQkJLy8gU2V0IGVqYk1vZHVsZSBmb2xkZXIgKGNyZWF0ZWQgZHVyaW5nIGpzdC5lamIgZmFjZXQgaW5zdGFsbGF0aW9uKSBhcyBzb3VyY2UgZm9sZGVyDQotCQlmaW5hbCBJRm9sZGVyIHNyY0ZvbGRlciA9IGVqYlByb2plY3QuZ2V0Rm9sZGVyKCJlamJNb2R1bGUiKTsNCi0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBlamJNb2R1bGVDcEVudHJ5ID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkoc3JjRm9sZGVyLmdldEZ1bGxQYXRoKCkubWFrZUFic29sdXRlKCkpOw0KLQkJYWRkVG9DbGFzc3BhdGgoSmF2YUNvcmUuY3JlYXRlKGVqYlByb2plY3QpLCBlamJNb2R1bGVDcEVudHJ5KTsNCi0JCQ0KLQkJcmV0dXJuIGVqYlByb2plY3Q7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU291cmNlRm9sZGVycyhmaW5hbCBJSmF2YVByb2plY3QgamF2YVApIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IG5ld0NsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOw0KLQkJZm9yKElDbGFzc3BhdGhFbnRyeSBjcEVudHJ5IDogamF2YVAuZ2V0UmF3Q2xhc3NwYXRoKCkpDQotCQl7DQotCQkJaWYoY3BFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkNCi0JCQl7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQluZXdDbGFzc3BhdGguYWRkKGNwRW50cnkpOw0KLQkJfQ0KLQkJamF2YVAuc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3Q2xhc3NwYXRoLnNpemUoKV0pLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdFdpdGhGYWNldChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsIGZpbmFsIFN0cmluZ1tdIGZhY2V0SWQsIGZpbmFsIFN0cmluZ1tdIGZhY2V0VmVyc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IGZhY2V0SWQubGVuZ3RoID09IGZhY2V0VmVyc2lvbi5sZW5ndGg7DQotCQlmaW5hbCBJUHJvamVjdFtdIHJlc3VsdCA9IG5ldyBJUHJvamVjdFsxXTsNCi0JCXRyeQ0KLQkJew0KLQkJCVRlc3RDb250ZXh0LnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCl7DQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQkJCQl7DQotCQkJCQl0cnkNCi0JCQkJCXsNCi0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7DQotCQkJCQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHJlc3VsdFswXSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCQ0KLQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBmYWNldElkLmxlbmd0aDsgaSsrKQ0KLQkJCQkJCXsNCi0JCQkJCQkJZmluYWwgSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChmYWNldElkW2ldKTsNCi0JCQkJCQkJZmFjZXRlZFByb2plY3QuaW5zdGFsbFByb2plY3RGYWNldChmYWNldC5nZXRWZXJzaW9uKGZhY2V0VmVyc2lvbltpXSksIG51bGwsIG1vbml0b3IpOw0KLQkJCQkJCX0NCi0JCQkJCQkNCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCQkJCXsNCi0JCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsNCi0JCQkJCX0NCi0JCQkJfX0sIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpKTsNCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlpZihlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQ0KLQkJCXsNCi0JCQkJdGhyb3cgKENvcmVFeGNlcHRpb24pZS5nZXRDYXVzZSgpOw0KLQkJCX0NCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7DQotCQl9DQotCQkNCi0JCXJldHVybiByZXN1bHRbMF07DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBkeW5hbWljIHdlYiBtb2R1bGUgcHJvamVjdCB3aXRoICJqc3Qud2ViIiBmYWNldCB2ZXIuIDIuNSBpbnN0YWxsZWQNCi0JICogQHBhcmFtIHByb2plY3ROYW1lDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlV2ViMjVQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVByb2plY3Qgd2ViUHJvamVjdCA9IGNyZWF0ZVByb2plY3RXaXRoRmFjZXQocHJvamVjdE5hbWUsIG5ldyBTdHJpbmdbXXsianN0LmphdmEiLCAianN0LndlYiJ9LCBuZXcgU3RyaW5nW117IjUuMCIsICIyLjUifSk7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVAgPSBKYXZhQ29yZS5jcmVhdGUod2ViUHJvamVjdCk7DQotDQotCQlyZW1vdmVBbGxTb3VyY2VGb2xkZXJzKGphdmFQKTsNCi0NCi0JCXJldHVybiB3ZWJQcm9qZWN0Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3RocmVhZGluZy9UZXN0Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Zjc2ODg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZzsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5Nb2RhbENvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotDQotLyoqDQotICogVXRpbGl0eSB0byBleGVjdXRlIHJ1bm5hYmxlIGluc3RhbmNlcyBpbiBhIHNlcGFyYXRlIHRocmVhZC4gSW1wbGVtZW50YXRpb24gaXMgcHJldHR5IHNpbWlsYXIgdG8ge0BsaW5rIE1vZGFsQ29udGV4dH0gYnV0IGl0IHVzZXMge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfSB0byBwZXJmb3JtIGZvcmtpbmcNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUZXN0Q29udGV4dA0KLXsNCi0JLyoqDQotCSAqIEV4ZWN1dGVzIHRoZSBvcGVyYXRpb24gc3BlY2lmaWVkIGluIHRoZSBjYWxsZXIgb3IgaW4gYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9IHRocmVhZCBkZXBlbmRpbmcgb24gdGhlIDxjb2RlPmZvcms8L2NvZGU+IHZhbHVlLiBJbiBjYXNlIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgaXMgYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9IGluc3RhbmNlLCB0aGUgZXhlY3V0aW9uIG9mIHRoZSA8Y29kZT5vcGVyYXRpb248L2NvZGU+IGlzIHBlcmZvcm1lZCBpbiB0aGUgY3VycmVudCB0aHJlYWQgbm8gbWF0dGVyDQotCSAqIG9mIHRoZSA8Y29kZT5mb3JrPC9jb2RlPiB2YWx1ZQ0KLQkgKiANCi0JICogQHBhcmFtIG9wZXJhdGlvbg0KLQkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb247IG11c3Qgbm90IGJlIG51bGwNCi0JICogQHBhcmFtIGZvcmsNCi0JICogICAgICAgICAgICB0cnVlIHRvIHBlcmZvcm0gdGhlIDxjb2RlPm9wZXJhdGlvbjwvY29kZT4gaW4gYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9OyBmYWxzZSB0byBwZXJmb3JtIHRoZSA8Y29kZT5vcGVyYXRpb248L2NvZGU+IGluIHRoZSBjdXJyZW50IHRocmVhZA0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIHByb2dyZXNzIG1vbml0b3INCi0JICogQHBhcmFtIGRpc3BsYXkgVE9ETw0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bihmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uLCBmaW5hbCBib29sZWFuIGZvcmssIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKG9wZXJhdGlvbiwgIm9wZXJhdGlvbiIpOw0KLQ0KLQkJZmluYWwgYm9vbGVhbiB3aWxsRm9yayA9ICFpc0luVGVzdENvbnRleHRUaHJlYWQoKSAmJiBmb3JrOw0KLQkJaWYgKHdpbGxGb3JrKQ0KLQkJew0KLQkJCXJ1bkluVGVzdENvbnRleHRUaHJlYWQob3BlcmF0aW9uLCBtb25pdG9yLCBkaXNwbGF5KTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXJ1bkluQ3VycmVudFRocmVhZChvcGVyYXRpb24sIG1vbml0b3IpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSdW5zIHRoZSBvcGVyYXRpb24gaW4gdGhlIGN1cnJlbnQgdGhyZWFkDQotCSAqIA0KLQkgKiBAcGFyYW0gb3BlcmF0aW9uDQotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgYSB7QGxpbmsgVGhyb3dhYmxlfSBoYXMgYmVlbiB0aHJvd24gZHVyaW5nIG9wZXJhdGlvbiBleGVjdXRpb24uIFRoZSBleGNlcHRpb24gd3JhcHMgdGhhdCB7QGxpbmsgVGhyb3dhYmxlfQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5JbkN1cnJlbnRUaHJlYWQoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJb3BlcmF0aW9uLnJ1bihtb25pdG9yKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUnVucyB0aGUgb3BlcmF0aW9uIGluIGEge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfS4NCi0JICogDQotCSAqIEBwYXJhbSBydW5uYWJsZQ0KLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbg0KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgdGhlIHtAbGluayBUZXN0Q29udGV4dFRocmVhZH0gZmluaXNoZWQgd2l0aCBlcnJvcg0KLQkgKiBAc2VlIFRlc3RDb250ZXh0VGhyZWFkI2dldEVycm9yKCkNCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgcnVuSW5UZXN0Q29udGV4dFRocmVhZChmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBUZXN0Q29udGV4dFRocmVhZCBjb250ZXh0VGhyZWFkID0gbmV3IFRlc3RDb250ZXh0VGhyZWFkKHJ1bm5hYmxlLCBtb25pdG9yLCBkaXNwbGF5KTsNCi0JCWNvbnRleHRUaHJlYWQuc3RhcnQoKTsNCi0JCWNvbnRleHRUaHJlYWQuYmxvY2soKTsNCi0NCi0JCWlmIChjb250ZXh0VGhyZWFkLmdldEVycm9yKCkgIT0gbnVsbCkNCi0JCXsNCi0JCQlpZihjb250ZXh0VGhyZWFkLmdldEVycm9yKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7DQotCQkJCXRocm93IChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKWNvbnRleHRUaHJlYWQuZ2V0RXJyb3IoKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGNvbnRleHRUaHJlYWQuZ2V0RXJyb3IoKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW5zdGFuY2Ugb2Yge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luVGVzdENvbnRleHRUaHJlYWQoKQ0KLQl7DQotCQlmaW5hbCBUaHJlYWQgdCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7DQotCQlyZXR1cm4gdCBpbnN0YW5jZW9mIFRlc3RDb250ZXh0VGhyZWFkOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0VGhyZWFkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3RocmVhZGluZy9UZXN0Q29udGV4dFRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZDFiYjkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0VGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi0NCi0vKioNCi0gKiB7QGxpbmsgVGhyZWFkfSBleHRlbmRlciB3aGljaCBpcyBjYXBhYmxlIG9mIHByb3ZpZGluZyBldmVudCBsb29wIHByb2Nlc3Npbmcgd2hpbGUgdGhlIHJ1bm5hYmxlIGlzIGV4ZWN1dGVkPGJyPg0KLSAqIEEgdHlwaWNhbCB1c2FnZSBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZToNCi0gKiANCi0gKiA8cHJlPg0KLSAqIFRlc3RDb250ZXh0VGhyZWFkIHQgPSBuZXcgVGVzdENvbnRleHRUaHJlYWQoc29tZVJ1bm5hYmxlKCkpOw0KLSAqIHQuc3RhcnQoKTsNCi0gKiB0LmJsb2NrKCk7DQotICogPC9wcmU+DQotICogDQotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdGhyZWFkIHJlc2VtYmxlcyB0byB0aGUgTW9kYWxDb250ZXh0VGhyZWFkIHdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCBpdCBkb2VzIG5vdCBjYWxsIHtAbGluayBEaXNwbGF5I3NsZWVwKCl9IGFuZCBpcyBzaW1wbGlmaWVkIGluIG9yZGVyIHRvIG1lZXQgdGVzdCByZXF1aXJlbWVudHMuIFRoZSByZWFzb24gbm90IHRvIGNhbGwge0BsaW5rIERpc3BsYXkjc2xlZXAoKX0gaXMgdGhhdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgcHV0dGluZyB0aGUgZGlzcGxheSB0bw0KLSAqIHNsZWVwIGNhdXNlcyBqdW5pdCB0ZXN0cyB0byB3YWl0IGZvcmV2ZXINCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLWNsYXNzIFRlc3RDb250ZXh0VGhyZWFkIGV4dGVuZHMgVGhyZWFkDQotew0KLQlwcml2YXRlIGJvb2xlYW4gaXNSdW5uaW5nOw0KLQlwcml2YXRlIFRocm93YWJsZSBlcnJvclRocm93YWJsZTsNCi0JcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7DQotCXByaXZhdGUgZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlOw0KLQlwcml2YXRlIGZpbmFsIERpc3BsYXkgZGlzcGxheTsNCi0NCi0JVGVzdENvbnRleHRUaHJlYWQoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIERpc3BsYXkgZGlzcGxheSkNCi0Jew0KLQkJc3VwZXIoKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShydW5uYWJsZSwgInJ1bm5hYmxlIik7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obW9uaXRvciwgIm1vbml0b3IiKTsNCi0JCQ0KLQkJaXNSdW5uaW5nID0gdHJ1ZTsNCi0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7DQotCQl0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7DQotCQl0aGlzLnNldE5hbWUoIlRlc3RDb250ZXh0Iik7DQotCQl0aGlzLnNldERhZW1vbih0cnVlKTsNCi0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0aGUgZXJyb3IgdGhyb3dhYmxlIHdoaWNoIGhhcHBlbmVkIGR1cmluZyBleGVjdXRpb24NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGVycm9yIHRocm93YWJsZSBvciBudWxsIGlmIG5vbmUNCi0JICovDQotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXJyb3IoKQ0KLQl7DQotCQlyZXR1cm4gZXJyb3JUaHJvd2FibGU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHJ1bigpDQotCXsNCi0JCWlzUnVubmluZyA9IHRydWU7DQotCQl0cnkNCi0JCXsNCi0JCQlydW5uYWJsZS5ydW4obW9uaXRvcik7DQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkNCi0JCXsNCi0JCQllcnJvclRocm93YWJsZSA9IHQ7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQkvLyBNYWtlIHN1cmUgdGhhdCBhc3luY2hyb25vdXMgZXZlbnRzIGFyZSBwcm9jZXNzZWQgYnkgdGhlIGV2ZW50IGxvb3AgdmlhIHN5bmMgZXhlY3V0aW9uIG9mIGFuICJlbXB0eSIgcnVubmFibGUNCi0JCQlkaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkNCi0JCQl7DQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpDQotCQkJCXsNCi0JCQkJfQ0KLQkJCX0pOw0KLQkJCWlzUnVubmluZyA9IGZhbHNlOw0KLQ0KLQkJCS8vIEZvcmNlIHRoZSBkaXNwbGF5IHRvIHdha2UgdXANCi0JCQlkaXNwbGF5KCkuYXN5bmNFeGVjKG51bGwpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBCbG9ja3MgdGhlIGNhbGxlciB3aGlsZSB0aGUge0BsaW5rIFJ1bm5hYmxlfSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIGJlaW5nIGV4ZWN1dGVkLjxicj4NCi0JICogSWYgdGhlIGNhbGxlciBpcyB0aGUgVUkgdGhyZWFkLCB7QGxpbmsgRGlzcGxheSNyZWFkQW5kRGlzcGF0Y2goKX0gaXMgaW52b2tlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgZXZlbnQgbG9vcCBpcyBwcm9jZXNzZWQ8YnI+DQotCSAqIElmIHRoZSBjYWxsZXIgaXMgbm90IGEgVUkgdGhyZWFkLCB0aGlzIG1ldGhvZCBzaW1wbHkgam9pbnMuIDxicj4NCi0JICogDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIGluIGNhc2UgdGhlIG1ldGhvZCBpcyBpbnZva2VkIHdpdGhpbiBpdHMgb3duIHRocmVhZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYmxvY2soKQ0KLQl7DQotCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSB0aGlzKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgdGhlIHNhbWUgdGhyZWFkIik7DQotCQl9DQotDQotCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkNCi0JCXsNCi0JCQl0cnkNCi0JCQl7DQotCQkJCWpvaW4oKTsNCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkNCi0JCQl7DQotCQkJCWVycm9yVGhyb3dhYmxlID0gZTsNCi0JCQl9DQotCQl9IGVsc2UNCi0JCXsNCi0JCQl3aGlsZSAoaXNSdW5uaW5nKQ0KLQkJCXsNCi0JCQkJaWYoIWRpc3BsYXkoKS5yZWFkQW5kRGlzcGF0Y2goKSkNCi0JCQkJew0KLQkJCQkJdHJ5DQotCQkJCQl7DQotCQkJCQkJVGhyZWFkLnNsZWVwKDUwKTsNCi0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpDQotCQkJCQl7DQotCQkJCQkJLy8gaWdub3JlDQotCQkJCQkJKG5ldyBMb2dnZXIoKSkubG9nRGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIERpc3BsYXkgZGlzcGxheSgpDQotCXsNCi0JCXJldHVybiBkaXNwbGF5Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGZiMDMwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkOTI5ZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMNCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMsDQotIG9yZy5qbW9jaywNCi0gb3JnLmp1bml0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5jbGF6eg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjdhY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M4OGVmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNGM2MDBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPVV0aWxzIFRlc3RzIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMmJmZDljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotLyoqDQotICogVGVzdCBjYXNlIGZvciBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIgY2xhc3MNCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbigpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCW5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIobnVsbCk7DQotCQkJZmFpbCgiTlBFIGV4cGVjdGVkIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCS8vIGV4cGVjdGVkDQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCVN0cmluZ0lucHV0U3RyZWFtQWRhcHRlciBhZGFwdGVyID0gbmV3IFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcigiQUJDIik7DQotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZWFkKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKCJBQkMiKTsNCi0JCQlhc3NlcnRUcnVlKGFkYXB0ZXIucmVhZCgpID4gMCk7DQotDQotCQkJYWRhcHRlciA9IG5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIoIiIpOw0KLQkJCWFzc2VydFRydWUoYWRhcHRlci5yZWFkKCkgPT0gLTEpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4YzFiZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLlN0cmluZ0lucHV0U3RyZWFtQWRhcHRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5GaWxlVXRpbHNVbml0VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLkpheFdzVXRpbHNUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3RvcnlUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkluc3BlY3RvckltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkFubm90YXRpb25VdGlsc1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkFycmF5VmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkJvb2xlYW5WYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQ2xhc3NWYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuSW50ZWdlclZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5QYXJhbVZhbHVlUGFpckltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5TdHJpbmdWYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuY2xhenouQVNUVXRpbHNUZXN0Ow0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0c1N1aXRlDQotew0KLQkvKioNCi0JICogUmV0dXJucyBhIHRlc3Qgc3VpdGUgY29udGFpbmluZyB0aGUgdGVzdHMgdG8gYmUgcnVuIGJ5IEphdmEgRGV2ZWxvcGVyIFRlc3QgRGlzcGF0Y2hlcg0KLQkgKiANCi0JICogQHJldHVybiAtIGEgc3VpdGUgb2YganVuaXQgcGRlIHRlc3QNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotCXsNCi0JCWZpbmFsIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0NCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uRmFjdG9yeVRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5VmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvbnNCYXNlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25JbnNwZWN0b3JJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvblV0aWxzVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQm9vbGVhblZhbHVlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEludGVnZXJWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQYXJhbVZhbHVlUGFpckltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShRdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyaW5nVmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NWYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBU1RVdGlsc1Rlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbGVVdGlsc1VuaXRUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXhXc1V0aWxzVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyVGVzdC5jbGFzcyk7DQotCQkNCi0JCXJldHVybiBzdWl0ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9GaWxlVXRpbHNVbml0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvRmlsZVV0aWxzVW5pdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWQ0YTkxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9GaWxlVXRpbHNVbml0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5TdGF0dXNVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuSUZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuY29uc3RyYWludC5Jc0VxdWFsOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5jb25zdHJhaW50LklzU2FtZTsNCi0NCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWxzVW5pdFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UNCi17DQotCXByaXZhdGUgZmluYWwgSUZpbGVVdGlscyBmaWxlVXRpbHMgPSBGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0JcHJpdmF0ZSBNb2NrPElDb21waWxhdGlvblVuaXQ+IGN1TW9jazsNCi0JcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQljdU1vY2sgPSBtb2NrKElDb21waWxhdGlvblVuaXQuY2xhc3MpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcGlsYXRpb25Vbml0Q29udGVudERlYWxzQ29ycmVjdGx5V2l0aFdvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdGVzdENvbnRlbnQgPSAiTXlUZXN0Q29udGVudCI7DQotCQlmaW5hbCBNb2NrPElCdWZmZXI+IGJ1ZmZlck1vY2sgPSBtb2NrKElCdWZmZXIuY2xhc3MpOw0KLQkJYnVmZmVyTW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJzZXRDb250ZW50cyIpLndpdGgobmV3IElzU2FtZSh0ZXN0Q29udGVudCkpOw0KLQkJDQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiYmVjb21lV29ya2luZ0NvcHkiKTsNCi0JCWN1TW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXRCdWZmZXIiKS53aWxsKHJldHVyblZhbHVlKGJ1ZmZlck1vY2sucHJveHkoKSkpOw0KLQkJY3VNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImNvbW1pdFdvcmtpbmdDb3B5Iikud2l0aChuZXcgSXNFcXVhbCh0cnVlKSwgbmV3IElzU2FtZShtb25pdG9yKSk7DQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZGlzY2FyZFdvcmtpbmdDb3B5Iik7DQotDQotCQlmaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChjdU1vY2sucHJveHkoKSwgdGVzdENvbnRlbnQsIHRydWUsIG1vbml0b3IpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcGlsYXRpb25Vbml0Q29udGVudERvZXNOb3REaXNjYXJkV29ya2luZ0NvcHlPbkpNRSgpDQotCXsNCi0JCWZpbmFsIEphdmFNb2RlbEV4Y2VwdGlvbiB0ZXN0RXhjZXB0aW9uID0gbmV3IEphdmFNb2RlbEV4Y2VwdGlvbihuZXcgQ29yZUV4Y2VwdGlvbihTdGF0dXNVdGlscy5zdGF0dXNFcnJvcigiVEVTVCIpKSk7DQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiYmVjb21lV29ya2luZ0NvcHkiKS53aWxsKHRocm93RXhjZXB0aW9uKHRlc3RFeGNlcHRpb24pKTsNCi0JCWN1TW9jay5leHBlY3RzKG5ldmVyKCkpLm1ldGhvZCgiZGlzY2FyZFdvcmtpbmdDb3B5Iik7DQotCQljdU1vY2suZXhwZWN0cyhuZXZlcigpKS5tZXRob2QoImNvbW1pdFdvcmtpbmdDb3B5Iik7DQotCQkNCi0JCXRyeQ0KLQkJew0KLQkJCWZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50KGN1TW9jay5wcm94eSgpLCAiMTIzIiwgdHJ1ZSwgbW9uaXRvcik7DQotCQl9DQotCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJUZXN0IGV4Y2VwdGlvbiB3YXMgbm90IGNhdWdodCIsIGUgPT0gdGVzdEV4Y2VwdGlvbik7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdUNvbnRlbnRTYXZlc0RpcnR5RWRpdG9ycygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgYm9vbGVhbltdIHNhdmVFZGl0b3JJbnZva2VkID0gbmV3IGJvb2xlYW5bXXtmYWxzZX07DQotCQlmaW5hbCBib29sZWFuW10gc2V0Q29udGVudHNJbnZva2VkID0gbmV3IGJvb2xlYW5bXXtmYWxzZX07DQotCQkNCi0JCWZpbmFsIElGaWxlVXRpbHMgbXlGaWxlVXRpbHMgPSBuZXcgRmlsZVV0aWxzKCl7DQotCQkJcHVibGljIGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGNvbXBpbGF0aW9uIHVuaXQiLCBjdSA9PSBjdU1vY2sucHJveHkoKSk7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgdm9pZCBzYXZlRWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKCJTYXZlIGVkaXRvcnMgaW52b2tlZCBiZWZvcmUgc2V0IENVIGNvbnRlbnQiLCBzZXRDb250ZW50c0ludm9rZWRbMF0pOw0KLQkJCQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGNvbXBpbGF0aW9uIHVuaXQiLCBjdSA9PSBjdU1vY2sucHJveHkoKSk7DQotCQkJCXNhdmVFZGl0b3JJbnZva2VkWzBdID0gdHJ1ZTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChJQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBjb250ZW50LCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJCQkJCQkJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCQkJew0KLQkJCQlhc3NlcnRGYWxzZSgiU2V0IENVIGNvbnRlbnQgaW52b2tlZCBhZnRlciBlZGl0b3Igc2F2ZWQiLCBzYXZlRWRpdG9ySW52b2tlZFswXSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBDVSBjb250ZW50IiwgIk15Q29udGVudCIsIGNvbnRlbnQpOw0KLQkJCQlzZXRDb250ZW50c0ludm9rZWRbMF0gPSB0cnVlOw0KLQkJCX0NCi0JCX07DQotCQkNCi0JCW15RmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKGN1TW9jay5wcm94eSgpLCAiTXlDb250ZW50IiwgdHJ1ZSwgbnVsbCk7DQotCQlhc3NlcnRUcnVlKCJTZXQgY29udGVudHMgbm90IGludm9rZWQiLCBzZXRDb250ZW50c0ludm9rZWRbMF0pOw0KLQkJYXNzZXJ0VHJ1ZSgiU2F2ZSBlZGl0b3JzIG5vdCBpbnZva2VkIiwgc2F2ZUVkaXRvckludm9rZWRbMF0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VDb250ZW50RG9lc05vdFNhdmVzQ2xlYW5FZGl0b3JzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBib29sZWFuW10gaXNEaXNwbGF5ZWRJbnZva2VkID0gbmV3IGJvb2xlYW5bXXtmYWxzZX07DQotCQlmaW5hbCBib29sZWFuW10gc2V0Q29udGVudHNJbnZva2VkID0gbmV3IGJvb2xlYW5bXXtmYWxzZX07DQotCQkNCi0JCWZpbmFsIElGaWxlVXRpbHMgbXlGaWxlVXRpbHMgPSBuZXcgRmlsZVV0aWxzKCl7DQotCQkJcHVibGljIGJvb2xlYW4gaXNDb21waWxhdGlvblVuaXREaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGNvbXBpbGF0aW9uIHVuaXQiLCBjdSA9PSBjdU1vY2sucHJveHkoKSk7DQotCQkJCWlzRGlzcGxheWVkSW52b2tlZFswXSA9IHRydWU7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIHZvaWQgc2F2ZUVkaXRvcihmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KQ0KLQkJCXsNCi0JCQkJZmFpbCgiVW5leHBlY3RlZCBpbnZvY2F0aW9uIik7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyB2b2lkIHNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgY29udGVudCwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCQkJCQkJCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJYXNzZXJ0RmFsc2UoIlNldCBDVSBjb250ZW50IGludm9rZWQgYWZ0ZXIgZWRpdG9yIHNhdmVkIiwgaXNEaXNwbGF5ZWRJbnZva2VkWzBdKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIENVIGNvbnRlbnQiLCAiTXlDb250ZW50IiwgY29udGVudCk7DQotCQkJCXNldENvbnRlbnRzSW52b2tlZFswXSA9IHRydWU7DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJbXlGaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoY3VNb2NrLnByb3h5KCksICJNeUNvbnRlbnQiLCB0cnVlLCBudWxsKTsNCi0JCWFzc2VydFRydWUoIlNldCBjb250ZW50cyBub3QgaW52b2tlZCIsIHNldENvbnRlbnRzSW52b2tlZFswXSk7DQotCQlhc3NlcnRUcnVlKCJJcyBkaXNwbGF5ZWQgaW4gZGlydHkgZWRpdG9yIG5vdCBpbnZva2VkIiwgaXNEaXNwbGF5ZWRJbnZva2VkWzBdKTsNCi0JfQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvSmF4V3NVdGlsc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL0pheFdzVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxMGY0YjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvSmF4V3NVdGlsc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7DQotDQotcHVibGljIGNsYXNzIEpheFdzVXRpbHNUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJUZXN0QmVhbiI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19GUV9OQU1FID0gIm9yZy5lY2xpcHNlLnRlc3QuIiArIENMQVNTX05BTUU7DQotCQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZV9XaXRoTnVsbCgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKG51bGwpOw0KLQkJCWZhaWwoIk5QRSBleHBlY3RlZCIpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJLy8gZXhwZWN0ZWQNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoKQ0KLQl7DQotCQlTdHJpbmcgbnMgPSBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgiIik7DQotCQlhc3NlcnRUcnVlKG5zLmVxdWFscygiaHR0cDovLy8iKSk7DQotCQlucyA9IEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCJhIik7DQotCQlhc3NlcnRUcnVlKG5zLmVxdWFscygiaHR0cDovL2EvIikpOw0KLQkJbnMgPSBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgiYS5iLmMiKTsNCi0JCWFzc2VydFRydWUobnMuZXF1YWxzKCJodHRwOi8vYi5hL2MvIikpOw0KLQkJbnMgPSBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgiYS5iLmMuZCIpOw0KLQkJYXNzZXJ0VHJ1ZShucy5lcXVhbHMoImh0dHA6Ly9iLmEvYy9kLyIpKTsNCi0JCW5zID0gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoImEuYi5jLmQuZSIpOw0KLQkJYXNzZXJ0VHJ1ZShucy5lcXVhbHMoImh0dHA6Ly9iLmEvYy9kL2UvIikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNlcnZpY2VOYW1lKCkNCi0Jew0KLQkJdHJ5IHsNCi0JCQlKYXhXc1V0aWxzLmdldERlZmF1bHRTZXJ2aWNlTmFtZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKXt9DQotCQkNCi0JCWFzc2VydEVxdWFscyhDTEFTU19OQU1FICsgIlNlcnZpY2UiLCAgSmF4V3NVdGlscy5nZXREZWZhdWx0U2VydmljZU5hbWUoQ0xBU1NfRlFfTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFBvcnR0eXBlTmFtZSgpDQotCXsNCi0JCXRyeSB7DQotCQkJSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydHR5cGVOYW1lKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pe30NCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKENMQVNTX05BTUUsICBKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUoQ0xBU1NfRlFfTkFNRSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFBvcnROYW1lKCkNCi0Jew0KLQkJdHJ5IHsNCi0JCQlKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKXt9DQotCQkNCi0JCWFzc2VydEVxdWFscyhDTEFTU19OQU1FICsgIlBvcnQiLCAgSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydE5hbWUoQ0xBU1NfRlFfTkFNRSkpOw0KLQl9DQotCQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDBjYjk1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi0vKioNCi0gKiBBbm5vdGF0aW9uRmFjdG9yeSBjbGFzcyB0ZXN0IGNhc2VzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikNCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZhY3RvcnlUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3RyaW5nVmFsdWUoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHN0clZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlhc3NlcnROb3ROdWxsKHN0clZhbHVlKTsNCi0JCWFzc2VydFRydWUoc3RyVmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoInZhbHVlIikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQYXJhbVZhbHVlUGFpcigpDQotCXsNCi0JCUlWYWx1ZSBzdHJWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShudWxsLCBzdHJWYWx1ZSk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIiIsIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCQ0KLQkJSVBhcmFtVmFsdWVQYWlyIHZhbHVlUGFpciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgc3RyVmFsdWUpOw0KLQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZVBhaXIpOw0KLQkJYXNzZXJ0VHJ1ZSh2YWx1ZVBhaXIuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIElWYWx1ZSk7DQotCQlhc3NlcnRUcnVlKHZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygicGFyYW0iKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBsZXhBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiANCi0Jew0KLQkJSVZhbHVlIHN0clZhbHVlMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHZhbHVlUGFpcjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHN0clZhbHVlMSk7DQotDQotCQlJVmFsdWUgc3RyVmFsdWUyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlMSIpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHZhbHVlUGFpcjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbTEiLCBzdHJWYWx1ZTIpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQodmFsdWVQYWlyMSk7DQotCQlwYXJhbVZhbHVlcy5hZGQodmFsdWVQYWlyMik7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKG51bGwsIHBhcmFtVmFsdWVzLCBlbmRwb2ludCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIiIsIG51bGwsIGVuZHBvaW50KTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJNeU5hbWUiLCBudWxsLCBlbmRwb2ludCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotLy8JCXRyeQ0KLS8vCQl7DQotLy8JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJNeU5hbWUiLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOw0KLS8vCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0vLwkJfQ0KLS8vCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotLy8JCXsNCi0vLwkJfQ0KLQ0KLQkJDQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGNhID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigibmFtZSIsIHBhcmFtVmFsdWVzLCBlbmRwb2ludCk7DQotCQlhc3NlcnROb3ROdWxsKGNhKTsNCi0JCWFzc2VydEVxdWFscyhjYS5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCksIDIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVWYWx1ZVBhaXIoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCIiLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShudWxsLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBcnJheVZhbHVlKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQXJyYXlWYWx1ZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQXJyYXlWYWx1ZShuZXcgSGFzaFNldDxJVmFsdWU+KCkpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCUlWYWx1ZSBzdHJWYWx1ZTEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUxIik7DQotCQlJVmFsdWUgc3RyVmFsdWUyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlMiIpOw0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzLmFkZChzdHJWYWx1ZTEpOw0KLQkJdmFsdWVzLmFkZChzdHJWYWx1ZTIpOw0KLQkJDQotCQkNCi0JCUlWYWx1ZSBhcnJWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFycmF5VmFsdWUodmFsdWVzKTsNCi0JCWFzc2VydE5vdE51bGwoYXJyVmFsdWUpOw0KLQkJYXNzZXJ0VHJ1ZShhcnJWYWx1ZS50b1N0cmluZygpLmVxdWFscygiW3ZhbHVlMSwgdmFsdWUyXSIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCkNCi0Jew0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJRTmFtZSIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQkNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJSVZhbHVlIHFOYW1lID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJvcmcuZWNsaXBzZS5kZW1vLlRlc3QiKTsNCi0JCWFzc2VydE5vdE51bGwocU5hbWUpOw0KLQkJYXNzZXJ0VHJ1ZShxTmFtZS50b1N0cmluZygpLmVxdWFscygib3JnLmVjbGlwc2UuZGVtby5UZXN0IikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVCb29sZWFuVmFsdWUoKQ0KLQl7DQotCQlJVmFsdWUgYm9vbFZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKHRydWUpOw0KLQkJYXNzZXJ0Tm90TnVsbChib29sVmFsdWUpOw0KLQkJYXNzZXJ0RXF1YWxzKGJvb2xWYWx1ZS50b1N0cmluZygpLCAidHJ1ZSIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uc0Zyb21DbGFzcygpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQl9DQotDQotLy8JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25zRnJvbUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLS8vCXsNCi0vLwkJcHJlcGFyZVByb2plY3QoKTsNCi0vLw0KLS8vCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotLy8JCWFzc2VydE5vdE51bGwoZmllbGQpOw0KLS8vDQotLy8JCUlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0dGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpIGdldEFubm90YXRpb25zRnJvbUZpZWxkKGZpZWxkKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotLy8JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMubGVuZ3RoID09IDEpOw0KLS8vCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFubm90YXRpb25zRnJvbU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7Ow0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbnNJVHlwZSgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludC5nZXRQYWNrYWdlRnJhZ21lbnQoKSk7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCQ0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuIGluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc01ldGhvZCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uc0lUeXBlU2V0T2ZTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlTZXQ8U3RyaW5nPiB0b1JlbW92ZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCXRvUmVtb3ZlLmFkZCgiV2ViU2VydmljZSIpOw0KLQkJdG9SZW1vdmUuYWRkKCJXZWJNZXRob2QiKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zKG51bGwsIHRvUmVtb3ZlKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zKGVuZHBvaW50LmdldFBhY2thZ2VGcmFnbWVudCgpLCB0b1JlbW92ZSk7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCQ0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnMoZW5kcG9pbnQsIHRvUmVtb3ZlKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTWV0aG9kLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbnNJRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotCQlhc3NlcnROb3ROdWxsKGZpZWxkKTsNCi0NCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGZpZWxkKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAyKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTWV0aG9kLnNpemUoKSA9PSAxKTsNCi0NCi0vLwkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZXRBbm5vdGF0aW9uc0Zyb21GaWVsZChmaWVsZCk7DQotLy8JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLS8vCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmxlbmd0aCA9PSAwKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbnNJTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2QoImFubm90YXRlZE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7DQotCQllbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChtZXRob2QpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTWV0aG9kLnNpemUoKT09IDApOw0KLQ0KLS8vCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUZpZWxkKGZpZWxkKTsNCi0vLwkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotLy8JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMubGVuZ3RoID09IDApOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwcmVwYXJlUHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkluc3BlY3RvckltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA4NDViOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25JbnNwZWN0b3JJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0VXBTcGVjaWZpYygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludEFubkluc3BlY3Rvci5zcmMiLCAiRW5kcG9pbnRBbm5JbnNwZWN0b3IiKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zcGVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKG51bGwpLmluc3BlY3RUeXBlKCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0RmllbGQobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24hIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JCQ0KLQkJSVZhbHVlIHN2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIk15IFZhbHVlIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHN2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElGaWVsZD4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SUZpZWxkPiBhbm5QID0gYW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFublApOw0KLQkJDQotCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0JCQ0KLQ0KLQkJSU1ldGhvZFtdIG1ldGhvZHMgPSBlbmRwb2ludC5nZXRNZXRob2RzKCk7DQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogbWV0aG9kcykNCi0JCXsNCi0JCQlpZihtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKSAhPSBudWxsICYmIG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpLmxlbmd0aCA+IDApDQotCQkJew0KLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgbWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKCkubGVuZ3RoOyBpKyspDQotCQkJCXsNCi0JCQkJCUlUeXBlUGFyYW1ldGVyIHBhcmFtID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIobWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKClbaV0pOw0KLQ0KLQkJCQkJSVZhbHVlIHN2UGFyYW0gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiU3RyaW5nIFZhbHUgUGFyYW0iKTsNCi0JCQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2UGFyYW0gPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQkJCQlwdlBhcmFtLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJQYXJhbUF0cmlidXRlIiwgc3ZQYXJhbSkpOw0KLQkJCQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFublBhbSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIlBhcmFtQW5ub3RhdGlvbiIsIHB2UGFyYW0sIHBhcmFtKTsNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5QYW0sIHBhcmFtKTsNCi0JCQkJCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBwYXJhbUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHBhcmFtKTsNCi0JCQkJCWFzc2VydE5vdE51bGwocGFyYW1Bbm5vdGF0aW9ucyk7DQotCQkJCQlhc3NlcnRUcnVlKHBhcmFtQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJCQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHRtcEFubiA9IHBhcmFtQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkJCQkNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUodG1wQW5uKTsNCi0JCQkJCXBhcmFtQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0ocGFyYW0pOw0KLQkJCQkJYXNzZXJ0Tm90TnVsbChwYXJhbUFubm90YXRpb25zKTsNCi0JCQkJCWFzc2VydFRydWUocGFyYW1Bbm5vdGF0aW9ucy5zaXplKCkgPT0gMCk7DQotCQkJCQkNCi0JCQkJCWFublBhbSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIlBhcmFtQW5ub3RhdGlvbjIiLCBwdlBhcmFtLCBwYXJhbSk7DQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uUGFtLCBwYXJhbSk7DQotCQkJCQlwYXJhbUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHBhcmFtKTsNCi0JCQkJCWFzc2VydE5vdE51bGwocGFyYW1Bbm5vdGF0aW9ucyk7DQotCQkJCQlhc3NlcnRUcnVlKHBhcmFtQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQocGFyYW0pOw0KLQkJCQkJcGFyYW1Bbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbShwYXJhbSk7DQotCQkJCQlhc3NlcnROb3ROdWxsKHBhcmFtQW5ub3RhdGlvbnMpOw0KLQkJCQkJYXNzZXJ0VHJ1ZShwYXJhbUFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEluc3BlY3RvclNwZWNpZmljQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXBTcGVjaWZpYygpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gaW5zcGVjdGVkVHlwZUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgib3JnLmVjbGlwc2UuZGVtby5NeUFubm90YXRpb24iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkVHlwZUFubm90YXRpb24pOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm15VmFsdWUiKSwgIk15U3RyaW5nIik7IA0KLQkJDQotCQlpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbiA9IG51bGw7DQotCQkJCQ0KLQkJaW5zcGVjdGVkVHlwZUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgiamF2YXguandzLldlYlNlcnZpY2UiKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkVHlwZUFubm90YXRpb24pOw0KLQkJYXNzZXJ0VHJ1ZSgiamF2YXguandzLldlYlNlcnZpY2UiLmVuZHNXaXRoKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzZXJ2aWNlTmFtZSIpLCAiV1NJbXBsQmVhblNlcnZpY2UiKTsgDQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiV1NJbXBsQmVhbiIpOyANCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0YXJnZXROYW1lc3BhY2UiKSwgImh0dHA6Ly9kZW1vL2VjbGlwc2Uvb3JnLyIpOyANCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwb3J0TmFtZSIpLCAiV1NJbXBsQmVhblBvcnQiKTsgDQotDQotCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotCQlJQW5ub3RhdGlvbjxJRmllbGQ+IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChmaWVsZCwgIm9yZy5lY2xpcHNlLmRlbW8uTXlGaWVsZEFubm90YXRpb24iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoIm9yZy5lY2xpcHNlLmRlbW8uTXlGaWVsZEFubm90YXRpb24iLmVuZHNXaXRoKGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKSwgImZpZWxkMSIpOw0KLQkJDQotCQlpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24gPSBudWxsOw0KLQkJDQotCQlpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0RmllbGQoZmllbGQsICJqYXZheC5qd3MuV2ViRmllbGQiKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoImphdmF4Lmp3cy5XZWJGaWVsZCIuZW5kc1dpdGgoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiTXlGaWVsZCIpOw0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2RzKClbMF07DQotCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QsICJvcmcuZWNsaXBzZS5kZW1vLk15TWV0aG9kQW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoIm9yZy5lY2xpcHNlLmRlbW8uTXlNZXRob2RBbm5vdGF0aW9uIi5lbmRzV2l0aChpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKSwgImFubm90YXRlZE1ldGhvZCIpOw0KLQkJDQotCQlpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uID0gbnVsbDsNCi0JCQ0KLQkJaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kLCAiamF2YXguandzLldlYk1ldGhvZCIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoImphdmF4Lmp3cy5XZWJNZXRob2QiLmVuZHNXaXRoKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiZXhjbHVkZSIpLCAiZmFsc2UiKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm9wZXJhdGlvbk5hbWUiKSwgInRlc3QiKTsNCi0NCi0JCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcigiYW5ub3RhdGVkUGFyYW0iKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlciwgIm9yZy5lY2xpcHNlLmRlbW8uTXlQYXJhbUFubm90YXRpb24iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoIm9yZy5lY2xpcHNlLmRlbW8uTXlQYXJhbUFubm90YXRpb24iLmVuZHNXaXRoKGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKSwgImFubm90YXRlZE15UGFyYW0iKTsNCi0JCQ0KLQkJaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uID0gbnVsbDsNCi0JCQ0KLQkJaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIsICJqYXZheC5qd3MuV2ViUGFyYW0iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoImphdmF4Lmp3cy5XZWJQYXJhbSIuZW5kc1dpdGgoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLCAiYW5ub3RhdGVkUGFyYW0iKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEluc3BlY3RvckxvY2F0b3JSZXRyaWV2ZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwU3BlY2lmaWMoKTsJCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgiamF2YXguandzLldlYlNlcnZpY2UiKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7DQotDQotCQlhc3NlcnRFcXVhbHMoMTEsIGFubm90YXRpb24uZ2V0TG9jYXRvcigpLmdldExpbmVOdW1iZXIoKSk7DQotCQlhc3NlcnRFcXVhbHMoMjI2LCBhbm5vdGF0aW9uLmdldExvY2F0b3IoKS5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDEzNCwgYW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkuZ2V0TGVuZ3RoKCkpOw0KLQkJDQotCQlhc3NlcnRFcXVhbHMoMTEsIGdldFBhcmFtKCJwb3J0TmFtZSIsIGFubm90YXRpb24pLmdldExvY2F0b3IoKS5nZXRMaW5lTnVtYmVyKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDMzNCwgZ2V0UGFyYW0oInBvcnROYW1lIiwgYW5ub3RhdGlvbikuZ2V0TG9jYXRvcigpLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoMjUsIGdldFBhcmFtKCJwb3J0TmFtZSIsIGFubm90YXRpb24pLmdldExvY2F0b3IoKS5nZXRMZW5ndGgoKSk7CQkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJUGFyYW1WYWx1ZVBhaXIgZ2V0UGFyYW0oZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24pIA0KLQl7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbSA6IGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkpIHsNCi0JCQlpZihwYXJhbS5nZXRQYXJhbSgpLmVxdWFscyhuYW1lKSkgew0KLQkJCQlyZXR1cm4gcGFyYW07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGRiZTdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvblByb3BlcnR5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkF0dHJpYnV0ZVR5cGVFbnVtOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLQlwcml2YXRlIE1vY2s8SVR5cGU+IHR5cGUgPSBtb2NrKElUeXBlLmNsYXNzKTsNCi0JcHJpdmF0ZSBNb2NrPElNZXRob2Q+IG1ldGhvZCA9IG1vY2soSU1ldGhvZC5jbGFzcyk7DQotCXByaXZhdGUgTW9jazxJVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtZXRlciA9IG1vY2soSVR5cGVQYXJhbWV0ZXIuY2xhc3MpOw0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQl0cnkgDQotCQl7DQotCQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShudWxsLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgbm90IHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQl0cnkgDQotCQl7DQotCQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWUiLCAidmFsdWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgbm90IHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQl0cnkgDQotCQl7DQotCQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWUiLCAidmFsdWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQUNLQUdFKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24hIik7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUxldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDEpOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJU2V0PElBbm5vdGF0aW9uPElUeXBlPj4gdHlwZUFubm90YXRpb25zID0gY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uIDogdHlwZUFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSA0KTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygidmFsdWVTdHJpbmciKSk7DQotCQl9DQotDQotCQljb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTEiLCAiYXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUyIiwgImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUzIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWU0IiwgImF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gNCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQl0eXBlQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSk7DQotDQotCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCW5hbWVzLmNsZWFyKCk7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMSIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTIiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUzIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lNCIpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uIDogdHlwZUFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUobmFtZXMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQkJbmFtZXMucmVtb3ZlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUxIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJ0cnVlIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTIiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUzIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWU0IikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOw0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygidmFsdWVTdHJpbmciKSk7CQkJCQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZExldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQlTZXQ8SUFubm90YXRpb248SU1ldGhvZD4+IG1ldGhvZEFubm90YXRpb25zID0gY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKTsNCi0JCQ0KLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0aW9uIDogbWV0aG9kQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0NCi0JCWNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMSIsICJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMiIsICJhdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUzIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTQiLCAiYXR0cmlidXRlTmFtZVN0cmluZyIsICJ2YWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDQpOw0KLQkJbWV0aG9kQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpOw0KLQ0KLQkJU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotCQluYW1lcy5jbGVhcigpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTEiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUyIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMyIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTQiKTsNCi0JCQ0KLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0aW9uIDogbWV0aG9kQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucyhhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCQluYW1lcy5yZW1vdmUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTEiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMiIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTMiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTQiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsJCQkJDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJMZXZlbCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eSBhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZVN0cmluZyIsICJ2YWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJU2V0PElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKTsNCi0JCQ0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5ub3RhdGlvbiA6IHBhcmFtZXRlckFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSA0KTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygidmFsdWVTdHJpbmciKSk7DQotCQl9DQotDQotCQljb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTEiLCAiYXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTIiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMyIsICJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWU0IiwgImF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQkNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSkuc2l6ZSgpID09IDQpOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCXBhcmFtZXRlckFubm90YXRpb25zID0gY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSk7DQotDQotCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0JCW5hbWVzLmNsZWFyKCk7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMSIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTIiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUzIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lNCIpOw0KLQkJDQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uIDogcGFyYW1ldGVyQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucyhhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCQluYW1lcy5yZW1vdmUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTEiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMiIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTMiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTQiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ2YWx1ZVN0cmluZyIpKTsJCQkJDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDb21iaW5lZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eSBhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJwYXJhbUFubm90YXRpb25OYW1lIiwgInBhcmFtQXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJwYXJhbUFubm90YXRpb25OYW1lIiwgInBhcmFtQXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInBhcmFtQW5ub3RhdGlvbk5hbWUiLCAicGFyYW1BdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5QQVJBTV9WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgicGFyYW1Bbm5vdGF0aW9uTmFtZSIsICJwYXJhbUF0dHJpYnV0ZU5hbWVTdHJpbmciLCAicGFyYW1WYWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0NCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoIm1ldGhvZEFubm90YXRpb25OYW1lIiwgIm1ldGhvZEF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgImZhbHNlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoIm1ldGhvZEFubm90YXRpb25OYW1lIiwgIm1ldGhvZEF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMSIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJtZXRob2RBbm5vdGF0aW9uTmFtZSIsICJtZXRob2RBdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5NRVRIT0RfVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoIm1ldGhvZEFubm90YXRpb25OYW1lIiwgIm1ldGhvZEF0dHJpYnV0ZU5hbWVTdHJpbmciLCAibWV0aG9kVmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotDQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJ0eXBlQW5ub3RhdGlvbk5hbWUiLCAidHlwZUF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgImZhbHNlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJ0eXBlQW5ub3RhdGlvbk5hbWUiLCAidHlwZUF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInR5cGVBbm5vdGF0aW9uTmFtZSIsICJ0eXBlQXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVFlQRV9WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInR5cGVBbm5vdGF0aW9uTmFtZSIsICJ0eXBlQXR0cmlidXRlTmFtZVN0cmluZyIsICJ0eXBlVmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDEpOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gMSk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDEpOw0KLQkJDQotCQlTZXQ8SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpOw0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5ub3RhdGlvbiA6IHBhcmFtZXRlckFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygicGFyYW1Bbm5vdGF0aW9uTmFtZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDQpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbUF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJ0cnVlIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbUF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtQXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlBBUkFNX1ZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbUF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInBhcmFtVmFsdWVTdHJpbmciKSk7DQotCQl9DQotDQotCQlTZXQ8SUFubm90YXRpb248SU1ldGhvZD4+IG1ldGhvZEFubm90YXRpb25zID0gY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKTsNCi0JCWZvciAoSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdGlvbiA6IG1ldGhvZEFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygibWV0aG9kQW5ub3RhdGlvbk5hbWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSA0KTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibWV0aG9kQXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoImZhbHNlIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJtZXRob2RBdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAxIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJtZXRob2RBdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uTUVUSE9EX1ZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJtZXRob2RBdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJtZXRob2RWYWx1ZVN0cmluZyIpKTsNCi0JCX0NCi0NCi0JCVNldDxJQW5ub3RhdGlvbjxJVHlwZT4+IHR5cGVBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKTsNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gOiB0eXBlQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJ0eXBlQW5ub3RhdGlvbk5hbWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSA0KTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidHlwZUF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJmYWxzZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidHlwZUF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0eXBlQXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlRZUEVfVkFMVUUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInR5cGVBdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJ0eXBlVmFsdWVTdHJpbmciKSk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblV0aWxzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvblV0aWxzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDI0NTJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25VdGlsc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVXRpbHNUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlJVmFsdWUgc3YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTXkgU3RyaW5nIFZhbHVlIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJQYXJhbSIsIHN2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldEFwcGxpZWRFbGVtZW50KCksIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbnNCYXNlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODE1ZDE0Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvbkltcGw7DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25zQmFzZUltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcFdpdG91dFJlbW92ZSgpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFVwV2l0b3V0UmVtb3ZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVcFdpdG91dFJlbW92ZTIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnRBbm5JbnNwZWN0b3Iuc3JjIiwgIkVuZHBvaW50QW5uSW5zcGVjdG9yIik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RCYXNlQW5ub3RhdHRpb25GdW5jdGlvbmFsaXR5KCkNCi0Jew0KLQkJQW5ub3RhdGlvbkltcGw8SVR5cGU+IGFubiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJVHlwZT4oImNvbS5zcGEudGVzdC5NeUFubm90YXRpb24iLCBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRBbm5vdGF0aW9uTmFtZSgpLCAiY29tLnNwYS50ZXN0Lk15QW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRTaW1wbGVBbm5vdGF0aW9uTmFtZSgpLCAiTXlBbm5vdGF0aW9uIik7DQotCQkvL2Fzc2VydEVxdWFscyhhbm4uZ2V0VmFsdWVUeXBlKCksIElWYWx1ZS5BTk5PVEFUSU9OX1ZBTFVFKTsNCi0JCQ0KLQkJYW5uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlPigiTXlOZXdBbm5vdGF0aW9uIiwgbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0QW5ub3RhdGlvbk5hbWUoKSwgIk15TmV3QW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRTaW1wbGVBbm5vdGF0aW9uTmFtZSgpLCAiTXlOZXdBbm5vdGF0aW9uIik7DQotCQkvL2Fzc2VydEVxdWFscyhhbm4uZ2V0VmFsdWVUeXBlKCksIElWYWx1ZS5BTk5PVEFUSU9OX1ZBTFVFKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gdG1wQW5uID0gYW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUodG1wQW5uKTsNCi0JCQ0KLQkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMCk7DQotCQkNCi0JCUlNZXRob2RbXSBtZXRob2RzID0gZW5kcG9pbnQuZ2V0TWV0aG9kcygpOw0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpDQotCQl7DQotCQkJaWYobWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKCkgIT0gbnVsbCAmJiBtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKS5sZW5ndGggPiAwKQ0KLQkJCXsNCi0JCQkJSUFubm90YXRpb248SU1ldGhvZD4gYW5uTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uTWV0aG9kIiwgcHYsIG1ldGhvZCk7DQotCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5NLCBtZXRob2QpOw0KLQkJCQlhc3NlcnRFcXVhbHMoImZ1bGwucXVhbGlmaWVkLk5hbWUiLCBhbm5NLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikpOw0KLQkJCQlhc3NlcnROdWxsKGFubk0uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW1Ob3RFeGlzdHMiKSk7DQotCQkJCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCQkJSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdE0gPSBhbm5vdGF0aW9uc00uaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkJCWFzc2VydEVxdWFscygicXVhbGlmaWVkLk5hbWUiLCBhbm5vdGF0TS5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbSIpKTsNCi0JCQkJDQotCQkJCUlWYWx1ZSBzdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJOZXcgU3RyaW5nIFZhbHVlIik7DQotCQkJCWFubk0uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIk5ld1BhcmFtIiwgc3YpKTsNCi0JCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShhbm5NKTsNCi0JCQkJYW5ub3RhdGlvbnNNID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTS5zaXplKCkgPT0gMSk7DQotCQkJCWFubm90YXRNID0gYW5ub3RhdGlvbnNNLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIk5ldyBTdHJpbmcgVmFsdWUiLCBhbm5vdGF0TS5nZXRQcm9wZXJ0eVZhbHVlKCJOZXdQYXJhbSIpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJxdWFsaWZpZWQuTmFtZSIsIGFubm90YXRNLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikpOw0KLQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubm90YXRNKTsNCi0JCQkJYW5ub3RhdGlvbnNNID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTS5zaXplKCkgPT0gMCk7DQotDQotCQkJCUlWYWx1ZSBzdjMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTmV3IFN0cmluZyBWYWx1ZTMiKTsNCi0JCQkJYW5uTS5nZXRQYXJhbVZhbHVlUGFpcnMoKS5jbGVhcigpOw0KLQkJCQlhbm5NLmdldFBhcmFtVmFsdWVQYWlycygpLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJOZXdQYXJhbSIsIHN2MykpOw0KLQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKGFubk0pOw0KLQkJCQlhbm5vdGF0aW9uc00gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNLnNpemUoKSA9PSAxKTsNCi0JCQkJYW5ub3RhdE0gPSBhbm5vdGF0aW9uc00uaXRlcmF0b3IoKS5uZXh0KCk7DQotCQkJCWFzc2VydEVxdWFscygiTmV3IFN0cmluZyBWYWx1ZTMiLCBhbm5vdGF0TS5nZXRQcm9wZXJ0eVZhbHVlKCJOZXdQYXJhbSIpKTsNCi0NCi0JCQkJLy8gY2xlYXIgYW5ub3RhdGlvbg0KLQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubk0pOw0KLQ0KLQkJCQlhbm5vdGF0aW9uc00gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNLnNpemUoKSA9PSAwKTsNCi0JCQkJDQotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKS5sZW5ndGg7IGkrKykNCi0JCQkJew0KLQkJCQkJSVR5cGVQYXJhbWV0ZXIgcGFyYW0gPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKVtpXSk7DQotDQotCQkJCQlJVmFsdWUgc3ZQYXJhbSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJTdHJpbmcgVmFsdSBQYXJhbSIpOw0KLQkJCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHZQYXJhbSA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCQkJCXB2UGFyYW0uYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIlBhcmFtQXRyaWJ1dGUiLCBzdlBhcmFtKSk7DQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5uUCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIlBhcmFtQW5ub3RhdGlvbiIsIHB2UGFyYW0sIHBhcmFtKTsNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5QLCBwYXJhbSk7DQotCQkJCQkNCi0JCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uUCk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0dGlvblVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJSVZhbHVlIHN2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIlN0cmluZ1ZhbHVlIik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBzcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlzcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInN0cmluZ1BhcmFtIiwgc3YpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiB0eXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlUeXBlQW5ub3RhdGlvbiIsIHNwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KHR5cGVBbm5vdGF0aW9uLCBlbmRwb2ludCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gdHlwZUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZUFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUodHlwZUFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiB0ZW1wVHlwZUFubm90YXRpb24gPSB0eXBlQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHModGVtcFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInN0cmluZ1BhcmFtIiksICJTdHJpbmdWYWx1ZSIpOw0KLQkJDQotCQlJVmFsdWUgbmV3U1YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTmV3U3RyaW5nVmFsdWUiKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IG5ld1NQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld1NQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgic3RyaW5nUGFyYW0iLCBuZXdTVikpOw0KLQkJQW5ub3RhdGlvbkltcGw8SVR5cGU+IG5ld1R5cGVBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlPigib3JnLmVjbGlwc2UudGVzdC5NeVR5cGVBbm5vdGF0aW9uIiwgbmV3U1BWKTsNCi0JCW5ld1R5cGVBbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoZW5kcG9pbnQpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKG5ld1R5cGVBbm5vdGF0aW9uKTsNCi0JCQ0KLQkJdHlwZUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZUFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUodHlwZUFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCXRlbXBUeXBlQW5ub3RhdGlvbiA9IHR5cGVBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgic3RyaW5nUGFyYW0iKSwgIk5ld1N0cmluZ1ZhbHVlIik7DQotDQotCQluZXdTViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJOZXdlc3RTdHJpbmdWYWx1ZSIpOw0KLQkJbmV3U1BWID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJbmV3U1BWLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJuZXdlc3RTdHJpbmdQYXJhbSIsIG5ld1NWKSk7DQotCQluZXdUeXBlQW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJVHlwZT4oIm9yZy5lY2xpcHNlLnRlc3QuTXlUeXBlQW5ub3RhdGlvbiIsIG5ld1NQVik7DQotCQluZXdUeXBlQW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKGVuZHBvaW50KTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShuZXdUeXBlQW5ub3RhdGlvbik7DQotDQotCQl0eXBlQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0Tm90TnVsbCh0eXBlQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZSh0eXBlQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJdGVtcFR5cGVBbm5vdGF0aW9uID0gdHlwZUFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0TnVsbCh0ZW1wVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgic3RyaW5nUGFyYW0iKSk7DQotCQlhc3NlcnRFcXVhbHModGVtcFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5ld2VzdFN0cmluZ1BhcmFtIiksICJOZXdlc3RTdHJpbmdWYWx1ZSIpOw0KLQ0KLQkJSU1ldGhvZCBmaXJzdE1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZHMoKVswXTsNCi0NCi0JCUlWYWx1ZSBpdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUludGVnZXJWYWx1ZSgiMTAiKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IGlwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCWlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiaW50ZWdlclBhcmFtIiwgaXYpKTsNCi0JCUlBbm5vdGF0aW9uPElNZXRob2Q+IG1ldGhvZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15TWV0aG9kQW5ub3RhdGlvbiIsIGlwdiwgZmlyc3RNZXRob2QpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KG1ldGhvZEFubm90YXRpb24sIGZpcnN0TWV0aG9kKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IG1ldGhvZEFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChmaXJzdE1ldGhvZCk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUobWV0aG9kQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SU1ldGhvZD4gdGVtcE1ldGhvZEFubm90YXRpb24gPSBtZXRob2RBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJpbnRlZ2VyUGFyYW0iKSwgIjEwIik7DQotCQkNCi0JCUlWYWx1ZSBuZXdJViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUludGVnZXJWYWx1ZSgiMTEiKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IG5ld0lQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld0lQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiaW50ZWdlclBhcmFtIiwgbmV3SVYpKTsNCi0JCUFubm90YXRpb25JbXBsPElNZXRob2Q+IG5ld01ldGhvZEFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SU1ldGhvZD4oIm9yZy5lY2xpcHNlLnRlc3QuTXlNZXRob2RBbm5vdGF0aW9uIiwgbmV3SVBWKTsNCi0JCW5ld01ldGhvZEFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShmaXJzdE1ldGhvZCk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUobmV3TWV0aG9kQW5ub3RhdGlvbik7DQotCQkNCi0JCW1ldGhvZEFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChmaXJzdE1ldGhvZCk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUobWV0aG9kQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJdGVtcE1ldGhvZEFubm90YXRpb24gPSBtZXRob2RBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJpbnRlZ2VyUGFyYW0iKSwgIjExIik7DQotDQotCQluZXdJViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUludGVnZXJWYWx1ZSgiMTAwIik7DQotCQluZXdJUFYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQluZXdJUFYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIm5ld2VzdEludGVnZXJQYXJhbSIsIG5ld0lWKSk7DQotCQluZXdNZXRob2RBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElNZXRob2Q+KCJvcmcuZWNsaXBzZS50ZXN0Lk15TWV0aG9kQW5ub3RhdGlvbiIsIG5ld0lQVik7DQotCQluZXdNZXRob2RBbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoZmlyc3RNZXRob2QpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKG5ld01ldGhvZEFubm90YXRpb24pOw0KLQ0KLQkJbWV0aG9kQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKGZpcnN0TWV0aG9kKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShtZXRob2RBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wTWV0aG9kQW5ub3RhdGlvbiA9IG1ldGhvZEFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0TnVsbCh0ZW1wTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJpbnRlZ2VyUGFyYW0iKSk7DQotCQlhc3NlcnRFcXVhbHModGVtcE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmV3ZXN0SW50ZWdlclBhcmFtIiksICIxMDAiKTsNCi0NCi0JCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBmaXJzdE1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKCJhbm5vdGF0ZWRQYXJhbSIpOw0KLQ0KLQkJSVZhbHVlIGJ2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKHRydWUpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gYnB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJYnB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJib29sZWFuUGFyYW0iLCBidikpOw0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHBhcmFtZXRlckFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15UGFyYW1ldGVyQW5ub3RhdGlvbiIsIGJwdiwgdHlwZVBhcmFtZXRlcik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQocGFyYW1ldGVyQW5ub3RhdGlvbiwgdHlwZVBhcmFtZXRlcik7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlcik7DQotCQlhc3NlcnROb3ROdWxsKHBhcmFtZXRlckFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUocGFyYW1ldGVyQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uID0gcGFyYW1ldGVyQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHModGVtcFBhcmFtZXRlckFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYm9vbGVhblBhcmFtIiksICJ0cnVlIik7DQotCQkNCi0JCUlWYWx1ZSBuZXdCViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZShmYWxzZSk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBuZXdCUFYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQluZXdCUFYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoImJvb2xlYW5QYXJhbSIsIG5ld0JWKSk7DQotCQlBbm5vdGF0aW9uSW1wbDxJVHlwZVBhcmFtZXRlcj4gbmV3UGFyYW1ldGVyQW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJVHlwZVBhcmFtZXRlcj4oIm9yZy5lY2xpcHNlLnRlc3QuTXlQYXJhbWV0ZXJBbm5vdGF0aW9uIiwgbmV3QlBWKTsNCi0JCW5ld1BhcmFtZXRlckFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZSh0eXBlUGFyYW1ldGVyKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShuZXdQYXJhbWV0ZXJBbm5vdGF0aW9uKTsNCi0JCQ0KLQkJcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlcik7DQotCQlhc3NlcnROb3ROdWxsKHBhcmFtZXRlckFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUocGFyYW1ldGVyQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJdGVtcFBhcmFtZXRlckFubm90YXRpb24gPSBwYXJhbWV0ZXJBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydEVxdWFscyh0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJib29sZWFuUGFyYW0iKSwgImZhbHNlIik7DQotDQotCQluZXdCViA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZSh0cnVlKTsNCi0JCW5ld0JQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld0JQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgibmV3ZXN0Qm9vbGVhblBhcmFtIiwgbmV3QlYpKTsNCi0JCW5ld1BhcmFtZXRlckFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SVR5cGVQYXJhbWV0ZXI+KCJvcmcuZWNsaXBzZS50ZXN0Lk15UGFyYW1ldGVyQW5ub3RhdGlvbiIsIG5ld0JQVik7DQotCQluZXdQYXJhbWV0ZXJBbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUodHlwZVBhcmFtZXRlcik7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUobmV3UGFyYW1ldGVyQW5ub3RhdGlvbik7DQotDQotCQlwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyKTsNCi0JCWFzc2VydE5vdE51bGwocGFyYW1ldGVyQW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShwYXJhbWV0ZXJBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbiA9IHBhcmFtZXRlckFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0TnVsbCh0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJib29sZWFuUGFyYW0iKSk7DQotCQlhc3NlcnRFcXVhbHModGVtcFBhcmFtZXRlckFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmV3ZXN0Qm9vbGVhblBhcmFtIiksICJ0cnVlIik7DQotCQkNCi0JCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24uIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdHlBZGRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcFdpdG91dFJlbW92ZSgpOw0KLQkJDQotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkNCi0JCXsNCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJdHJ5DQotCQkJCXsNCi0JCQkJCVNldDxTdHJpbmc+IGFubm9TZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotCQkJCQlhbm5vU2V0LmFkZCgiU3RhdGVsZXNzIik7DQotCQkJCQkNCi0JCQkJCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zKGVuZHBvaW50LCBhbm5vU2V0KTsNCi0JCQkJCQ0KLQkJCQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQkJCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCQkJCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KSk7DQotCQkJCQkNCi0JCQkJCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotDQotCQkJCQlJVmFsdWUgc3YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiU3RyaW5nVmFsdWUiKTsNCi0NCi0JCQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHNwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCQkJCXNwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgic3RyaW5nUGFyYW0iLCBzdikpOw0KLQkJCQkJDQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZT4gc0FubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlTdHJpbmdBbm5vdGF0aW9uIiwgc3B2LCBlbmRwb2ludCk7DQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoc0FubiwgZW5kcG9pbnQpOw0KLQkJCQkJDQotCQkJCQkNCi0JCQkJCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkJCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDMpOw0KLQkJCQkJSUFubm90YXRpb248SVR5cGU+IHRtcEFubiA9IGFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJCQkJDQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKHRtcEFubik7DQotCQkJCQkNCi0JCQkJCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDIpOw0KLQkJCQkJDQotCQkJCQlJTWV0aG9kW10gbWV0aG9kcyA9IGVuZHBvaW50LmdldE1ldGhvZHMoKTsNCi0JCQkJCWZvciAoSU1ldGhvZCBtZXRob2QgOiBtZXRob2RzKQ0KLQkJCQkJew0KLQkJCQkJCUlWYWx1ZSBzbXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiU3RyaW5nVmFsdWUiKTsNCi0JCQkJCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBzbXB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCQkJCXNtcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInN0cmluZ1BhcmFtIiwgc212KSk7DQotCQkJCQkJDQotCQkJCQkJSUFubm90YXRpb248SU1ldGhvZD4gc21Bbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbk1ldGhvZCIsIHNtcHYsIG1ldGhvZCk7DQotCQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KHNtQW5uLCBtZXRob2QpOw0KLQkJCQkJCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCQkJCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zTSk7DQotCQkJCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc00uc2l6ZSgpID09IDIpOw0KLQ0KLQkJCQkJCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQkJCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAyKTsNCi0NCi0JCQkJCX0NCi0JDQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLQkJCQl7DQotCQkJCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX07DQotCQkNCi0JCWdldFRlc3RQcm9qZWN0KCkuZ2V0U291cmNlRm9sZGVyKCkuZ2V0UmVzb3VyY2UoKS5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG51bGwpOw0KLQ0KLQkJDQotCQkNCi0JCQ0KLQl9DQotCQkNCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpDQotCXsNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uMSIsIHB2LCBlbmRwb2ludCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uMiIsIHB2LCBlbmRwb2ludCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uMyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uMSIsIHB2LCBlbmRwb2ludCk7DQotCQkNCi0JCWFzc2VydFRydWUoYW5uMS5lcXVhbHMoYW5uMSkpOw0KLQkJYXNzZXJ0RmFsc2UoYW5uMS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoYW5uMS5lcXVhbHMocXYpKTsNCi0JCWFzc2VydEZhbHNlKGFubjEuZXF1YWxzKGFubjIpKTsNCi0JCWFzc2VydFRydWUoYW5uMS5lcXVhbHMoYW5uMykpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldEFwcGxpZWRFbGVtZW50KCksIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcFdpdG91dFJlbW92ZTIoKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoIm9yZy5lY2xpcHNlLmRlbW8uTXlBbm5vdGF0aW9uIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uKTsNCi0JCUlMb2NhdG9yIGxvY2F0b3IgPSBpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYW5ub3RhdGlvbiBzdGFydCBwb3NpdGlvbiIsIDE5MSwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGxlbmd0aCIsIDMzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibXlWYWx1ZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgMjA1LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAxOCwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaW5zcGVjdGVkVHlwZUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgiamF2YXguandzLldlYlNlcnZpY2UiKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkVHlwZUFubm90YXRpb24pOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBAV2ViU2VydmljZSBhbm5vdGF0aW9uIHN0YXJ0IHBvc2l0aW9uIiwgMjI2LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBsZW5ndGgiLCAxMzQsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJzZXJ2aWNlTmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHNlcnZpY2VOYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgMjM4LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzZXJ2aWNlTmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAzMSwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQ0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJuYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc2VydmljZU5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCAyNzEsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHNlcnZpY2VOYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDE3LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotDQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoInRhcmdldE5hbWVzcGFjZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHRhcmdldE5hbWVzcGFjZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDI5MCwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdGFyZ2V0TmFtZXNwYWNlIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDQyLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotDQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoInBvcnROYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcG9ydE5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCAzMzQsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHBvcnROYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDI1LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlJRmllbGQgZmllbGQgPSBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIik7DQotCQlJQW5ub3RhdGlvbjxJRmllbGQ+IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChmaWVsZCwgIm9yZy5lY2xpcHNlLmRlbW8uTXlGaWVsZEFubm90YXRpb24iKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15RmllbGRBbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNDAxLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlGaWVsZEFubm90YXRpb24gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMzMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA0MjAsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMTMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChmaWVsZCwgImphdmF4Lmp3cy5XZWJGaWVsZCIpOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgV2ViRmllbGQgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA0MzcsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJGaWVsZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAyNSwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJuYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDQ0NywgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAxNCwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJSU1ldGhvZCBtZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2RzKClbMF07DQotCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QsICJvcmcuZWNsaXBzZS5kZW1vLk15TWV0aG9kQW5ub3RhdGlvbiIpOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15TWV0aG9kQW5ub3RhdGlvbiBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDQ5MiwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15TWV0aG9kQW5ub3RhdGlvbiBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCA0MywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA1MTIsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjIsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWluc3BlY3RlZE1ldGhvZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgImphdmF4Lmp3cy5XZWJNZXRob2QiKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJNZXRob2QgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA1MzgsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJNZXRob2QgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgNDYsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoImV4Y2x1ZGUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBleGNsdWRlIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNTQ5LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBleGNsdWRlIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDEzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotDQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm9wZXJhdGlvbk5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBvcGVyYXRpb25OYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNTYzLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBvcGVyYXRpb25OYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDIwLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIoImFubm90YXRlZFBhcmFtIik7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIsICJvcmcuZWNsaXBzZS5kZW1vLk15UGFyYW1Bbm5vdGF0aW9uIik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBNeVBhcmFtQW5ub3RhdGlvbiBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDY0OSwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15UGFyYW1Bbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDQzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNjY4LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDIzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyLCAiamF2YXguandzLldlYlBhcmFtIik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJQYXJhbSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDYxNiwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYlBhcmFtIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDMyLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNjI2LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDIxLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbnNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzE0MzNhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29tcGxleEFubm90YXRpb25RTlZhbHVlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCUlQYXJhbVZhbHVlUGFpciBwdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQocHYpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViU2VydmljZSIsIHBhcmFtVmFsdWVzLCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgZW5kcG9pbnQpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpLnNpemUoKSA+IDApOw0KLQl9DQotDQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uQXJyYXlWYWx1ZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU2luZ2xlRWxlbWVudEFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgbmV3IFN0cmluZ1tdIHsgInZhbDEiLCAidmFsMiIgfSk7DQotLy8JCWFubm90YXRpb24uYWRkVG9DbGFzcyhlbmRwb2ludCk7DQotLy8NCi0vLwkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uRmFjdG9yeS5nZXRBbm5vdGF0aW9uc0Zyb21DbGFzcyhlbmRwb2ludCkubGVuZ3RoID4gMCk7DQotLy8JfQ0KLS8vDQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNpbXBsZUFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotLy8Jew0KLS8vCQlJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU2ltcGxlQW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiKTsNCi0vLwkJYW5ub3RhdGlvbi5hZGRUb0NsYXNzKGVuZHBvaW50KTsNCi0vLw0KLS8vCQlhc3NlcnRUcnVlKEFubm90YXRpb25GYWN0b3J5LmdldEFubm90YXRpb25zRnJvbUNsYXNzKGVuZHBvaW50KS5sZW5ndGggPiAwKTsNCi0vLwl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBjbGFzcy4gVGhlIGFubm90YXRpb24gaGFzIHRoZSBmb3JtOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogCSBAV2ViU2VydmljZShzZXJ2aWNlTmFtZT0mcXVvdDtzZXJ2aWNlTmFtZSZxdW90OywNCi0JICogCSBuYW1lPSZxdW90O3BvcnRUeXBlTmFtZSZxdW90OywNCi0JICogCSB0YXJnZXROYW1lc3BhY2U9JnF1b3Q7aHR0cDovL2RlbW8uc2FwLmNvbS8mcXVvdDssDQotCSAqIAkgd3NkbExvY2F0aW9uPSZxdW90O2h0dHA6Ly93c2RsL3VybC8mcXVvdDssDQotCSAqIAkgcG9ydE5hbWU9JnF1b3Q7cG9ydE5hbWUmcXVvdDssDQotCSAqIAkgZW5kcG9pbnRJbnRlcmZhY2U9JnF1b3Q7b3JnLmVjbGlwc2UuZGVtby5JU2VpJnF1b3Q7KQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhDbGFzc0Fubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQ0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJzZXJ2aWNlTmFtZSIsICJzZXJ2aWNlTmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJuYW1lIiwgInBvcnRUeXBlTmFtZSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2RlbW8uc2FwLmNvbS8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAid3NkbExvY2F0aW9uIiwgImh0dHA6Ly93c2RsL3VybC8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAicG9ydE5hbWUiLCAicG9ydE5hbWUiKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAiZW5kcG9pbnRJbnRlcmZhY2UiLCAib3JnLmVjbGlwc2UuZGVtby5JU2VpIik7DQotDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgcGFyYW1WYWx1ZXMsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCBlbmRwb2ludCk7DQotDQotCQlBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCBhbm5vdGF0aW9uSW5zcGVjdG9yID0gbmV3IEFubm90YXRpb25JbnNwZWN0b3JJbXBsKGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiB0eXBlQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uSW5zcGVjdG9yLmluc3BlY3RUeXBlKCk7DQotDQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZT4gdHlwZUFubm90YXRpb24gOiB0eXBlQW5ub3RhdGlvbnMpDQotCQl7DQotCQkJaWYodHlwZUFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImphdmF4Lmp3cy5XZWJTZXJ2aWNlIikgfHwgdHlwZUFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoIldlYlNlcnZpY2UiKSkNCi0JCQl7DQotCQkJCWlmKHR5cGVBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSAhPSA2KQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgic2VydmljZU5hbWUiKS5lcXVhbHMoInNlcnZpY2VOYW1lIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIikuZXF1YWxzKCJwb3J0VHlwZU5hbWUiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInRhcmdldE5hbWVzcGFjZSIpLmVxdWFscygiaHR0cDovL2RlbW8uc2FwLmNvbS8iKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIndzZGxMb2NhdGlvbiIpLmVxdWFscygiaHR0cDovL3dzZGwvdXJsLyIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicG9ydE5hbWUiKS5lcXVhbHMoInBvcnROYW1lIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJlbmRwb2ludEludGVyZmFjZSIpLmVxdWFscygib3JnLmVjbGlwc2UuZGVtby5JU2VpIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkNCi0JCQkJcmVzdWx0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnRUcnVlKCJDbGFzcyBpcyBub3QgYW5ub3RhdGVkIGNvcnJlY3RseSIsIHJlc3VsdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgY29tcGxleCBhbm5vdGF0aW9uIGFuZCBhZGRzIGl0IHRvIG1ldGhvZCBkZWNsYXJhdGlvbi4gQW5ub3RhdGlvbiBoYXMgdGhlIGZvcm06DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAgXEBXZWJNZXRob2QoZXhjbHVkZT1mYWxzZSxvcGVyYXRpb25OYW1lPSZxdW90O2Fubm90YXRlZE1ldGhvZCZxdW90OyxhY3Rpb249JnF1b3Q7Z28mcXVvdDspCQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhNZXRob2RBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0NCi0JCUlWYWx1ZSBlbVZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKGZhbHNlKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJleGNsdWRlIiwgZW1WYWx1ZSkpOw0KLQ0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJvcGVyYXRpb25OYW1lIiwgImFubm90YXRlZE1ldGhvZCIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJhY3Rpb24iLCAiZ28iKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJCQkNCi0JCUlBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViTWV0aG9kIiwgcGFyYW1WYWx1ZXMsIG1ldGhvZCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgbWV0aG9kKTsNCi0NCi0JCUFubm90YXRpb25JbnNwZWN0b3JJbXBsIGFubm90YXRpb25JbnNwZWN0b3IgPSBuZXcgQW5ub3RhdGlvbkluc3BlY3RvckltcGwoZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gbWV0aG9kQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uSW5zcGVjdG9yLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCSAJCQ0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsNCi0JCWZvciAoSUFubm90YXRpb248SU1ldGhvZD4gbWV0aG9kQW5ub3RhdGlvbiA6IG1ldGhvZEFubm90YXRpb25zKQ0KLQkJew0KLQkJCWlmKG1ldGhvZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImphdmF4Lmp3cy5XZWJNZXRob2QiKSB8fCBtZXRob2RBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJXZWJNZXRob2QiKSkNCi0JCQl7DQotCQkJCWlmKG1ldGhvZEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpICE9IDMpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCFtZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImV4Y2x1ZGUiKS5lcXVhbHMoImZhbHNlIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCFtZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm9wZXJhdGlvbk5hbWUiKS5lcXVhbHMoImFubm90YXRlZE1ldGhvZCIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighbWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhY3Rpb24iKS5lcXVhbHMoImdvIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkNCi0JCQkJcmVzdWx0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnRUcnVlKCJNZXRob2QgaXMgbm90IGFubm90YXRlZCBjb3JyZWN0bHkiLCByZXN1bHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBhIG1ldGhvZCBwYXJhbWV0ZXIuIFRoZSBhbm5vdGF0aW9uIGhhcyB0aGUgZm9ybToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqICBcQFdlYlBhcmFtKG9wZXJhdGlvbk5hbWU9JnF1b3Q7YW5ub3RhdGVkUGFyYW0mcXVvdDssIHRhcmdldE5hbWVzcGFjZT0mcXVvdDtodHRwOi8vZGVtby5zYXAuY29tL3BhcmFtcy8mcXVvdDssIHBhcnROYW1lPSZxdW90O3BhcnROYW1lJnF1b3Q7KQ0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhQYXJhbUFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKCJhbm5vdGF0ZWRQYXJhbSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgImFubm90YXRlZFBhcmFtIiwgInBhcmFtIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZGVtby5zYXAuY29tL3BhcmFtcy8iKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAicGFydE5hbWUiLCAicGFydE5hbWUiKTsNCi0NCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYlBhcmFtIiwgcGFyYW1WYWx1ZXMsIHR5cGVQYXJhbWV0ZXIpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIHR5cGVQYXJhbWV0ZXIpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhZGRTdHJpbmdQcm9wZXJ0eShTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcywgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdmFsdWUpDQotCXsNCi0JCUlWYWx1ZSBwVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSh2YWx1ZSk7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcGFpciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUocHJvcGVydHksIHBWYWx1ZSk7DQotCQlwYXJhbVZhbHVlcy5hZGQocGFpcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQXJyYXlWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmY1ZTRkZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9BcnJheVZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5BcnJheVZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuU3RyaW5nVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBBcnJheVZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpDQotCXsNCi0JCVNldDxJVmFsdWU+IHZhbHVlczEgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMxLmNsZWFyKCk7DQotCQl2YWx1ZXMxLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwxIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYxID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczEpOw0KLQkJDQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMyID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMi5jbGVhcigpOw0KLQkJdmFsdWVzMi5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMiIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MiA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMyKTsNCi0NCi0JCWFzc2VydFRydWUoYXYxLmhhc2hDb2RlKCkgIT0gYXYyLmhhc2hDb2RlKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVZhbHVlSW1wbCgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCW5ldyBBcnJheVZhbHVlSW1wbChudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCVNldDxJVmFsdWU+IHZhbHVlczEgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMxLmNsZWFyKCk7DQotCQl2YWx1ZXMxLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwxIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYxID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczEpOw0KLQ0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMiA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczIuY2xlYXIoKTsNCi0JCXZhbHVlczIuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDIiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjIgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMik7DQotDQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMy5jbGVhcigpOw0KLQkJdmFsdWVzMy5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMSIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MyA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMzKTsNCi0NCi0JCWFzc2VydEZhbHNlKGF2MS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoYXYxLmVxdWFscygxMjMpKTsNCi0JCWFzc2VydEZhbHNlKGF2MS5lcXVhbHMoYXYyKSk7DQotDQotCQlhc3NlcnRUcnVlKGF2MS5lcXVhbHMoYXYzKSk7DQotCQlhc3NlcnRUcnVlKGF2MS5lcXVhbHMoYXYxKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheXMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCVNldDxJVmFsdWU+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlcy5jbGVhcigpOw0KLQkJdmFsdWVzLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwxIikpOw0KLQkJdmFsdWVzLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwyIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzKTsNCi0JCQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIGF2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHJlYWRBbm5vdGF0aW9uID0gYW5ub3RhdHRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJcmVhZEFubm90YXRpb24uZXF1YWxzKGFubik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubik7DQotCQlhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMCk7DQotDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQm9vbGVhblZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Jvb2xlYW5WYWx1ZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkYWQ4ZWE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Jvb2xlYW5WYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5BcnJheVZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQm9vbGVhblZhbHVlSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQm9vbGVhblZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuVmFsdWVJbXBsKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJbmV3IEFycmF5VmFsdWVJbXBsKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUJvb2xlYW5WYWx1ZUltcGwgYnYgPSBuZXcgQm9vbGVhblZhbHVlSW1wbCh0cnVlKTsNCi0JCQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIGJ2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHJlYWRBbm5vdGF0aW9uID0gYW5ub3RhdHRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJcmVhZEFubm90YXRpb24uZXF1YWxzKGFubik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubik7DQotCQlhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlCb29sZWFuVmFsdWVJbXBsIGJ2MSA9IG5ldyBCb29sZWFuVmFsdWVJbXBsKHRydWUpOw0KLQkJQm9vbGVhblZhbHVlSW1wbCBidjIgPSBuZXcgQm9vbGVhblZhbHVlSW1wbChmYWxzZSk7DQotCQlCb29sZWFuVmFsdWVJbXBsIGJ2MyA9IG5ldyBCb29sZWFuVmFsdWVJbXBsKHRydWUpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYnYxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShidjEuZXF1YWxzKDEyMykpOw0KLQkJYXNzZXJ0RmFsc2UoYnYxLmVxdWFscyhidjIpKTsNCi0NCi0JCWFzc2VydFRydWUoYnYxLmVxdWFscyhidjMpKTsNCi0JCWFzc2VydFRydWUoYnYxLmVxdWFscyhidjEpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9DbGFzc1ZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0NsYXNzVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDAwYTI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0NsYXNzVmFsdWVJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQ2xhc3NWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIENsYXNzVmFsdWVJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlDbGFzc1ZhbHVlSW1wbCBjdiA9IG5ldyBDbGFzc1ZhbHVlSW1wbChlbmRwb2ludC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQkJCQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBjdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiByZWFkQW5ub3RhdGlvbiA9IGFubm90YXR0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCXJlYWRBbm5vdGF0aW9uLmVxdWFscyhhbm4pOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbSIpLnRvU3RyaW5nKCksIGVuZHBvaW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JCWFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUNsYXNzVmFsdWVJbXBsIGN2MSA9IG5ldyBDbGFzc1ZhbHVlSW1wbChlbmRwb2ludC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlDbGFzc1ZhbHVlSW1wbCBjdjIgPSBuZXcgQ2xhc3NWYWx1ZUltcGwobnVsbCk7DQotCQlDbGFzc1ZhbHVlSW1wbCBjdjMgPSBuZXcgQ2xhc3NWYWx1ZUltcGwoZW5kcG9pbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoY3YxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShjdjEuZXF1YWxzKHRydWUpKTsNCi0JCWFzc2VydEZhbHNlKGN2MS5lcXVhbHMoY3YyKSk7DQotDQotCQlhc3NlcnRUcnVlKGN2MS5lcXVhbHMoY3YzKSk7DQotCQlhc3NlcnRUcnVlKGN2MS5lcXVhbHMoY3YxKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ29tcGxleEFubm90YXRpb25JbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ29tcGxleEFubm90YXRpb25JbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZjU2ZDJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0NvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9jazsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBDb21wbGV4QW5ub3RhdGlvbkltcGxUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotewkNCi0JcHJpdmF0ZSBNb2NrPElUeXBlPiB0eXBlRWxlbWVudCA9IG1vY2soSVR5cGUuY2xhc3MpOw0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJSVZhbHVlIHZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlIik7DQotCQlJUGFyYW1WYWx1ZVBhaXIgcHZwID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCB2YWx1ZSk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXBhcmFtVmFsdWVzLmFkZChwdnApOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24xID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZTIiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotDQotCQlhc3NlcnRUcnVlKGFubm90YXRpb24xLmhhc2hDb2RlKCkgIT0gYW5ub3RhdGlvbjIuaGFzaENvZGUoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHB2cCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgdmFsdWUpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQocHZwKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUyIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUiLCBwYXJhbVZhbHVlcywgdHlwZUVsZW1lbnQucHJveHkoKSk7DQotDQotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uMS5lcXVhbHMoYW5ub3RhdGlvbjIpKTsNCi0JCWFzc2VydEZhbHNlKGFubm90YXRpb24xLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uMS5lcXVhbHMoMTIzKSk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb24xLmVxdWFscyhhbm5vdGF0aW9uMykpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50LnNyYyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50LnNyYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI2OTliNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9FbmRwb2ludC5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IldTSW1wbEJlYW5TZXJ2aWNlIiwgbmFtZT0iV1NJbXBsQmVhbiIsIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RlbW8vZWNsaXBzZS9vcmcvIiwgcG9ydE5hbWU9IldTSW1wbEJlYW5Qb3J0IikNCi1AU3RhdGVsZXNzDQotcHVibGljIGNsYXNzIEVuZHBvaW50DQotew0KLQlATXlBbm5vdGF0aW9uKG5hbWU9ImZpZWxkMSIpDQotCXB1YmxpYyBTdHJpbmcgZmllbGQxOw0KLQkNCi0JQFdlYk1ldGhvZChleGNsdWRlPWZhbHNlLG9wZXJhdGlvbk5hbWU9InRlc3QiKQ0KLQlwdWJsaWMgdm9pZCBhbm5vdGF0ZWRNZXRob2QoIEBXZWJQYXJhbShuYW1lPSJhbm5vdGF0ZWRQYXJhbSIpIFN0cmluZyBhbm5vdGF0ZWRQYXJhbSkgDQotCXsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9FbmRwb2ludEFubkluc3BlY3Rvci5zcmMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9FbmRwb2ludEFubkluc3BlY3Rvci5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyNTBkNTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRW5kcG9pbnRBbm5JbnNwZWN0b3Iuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXguandzLldlYkZpZWxkOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotDQotQE15QW5ub3RhdGlvbihteVZhbHVlPSJNeVN0cmluZyIpDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IldTSW1wbEJlYW5TZXJ2aWNlIiwgbmFtZT0iV1NJbXBsQmVhbiIsIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RlbW8vZWNsaXBzZS9vcmcvIiwgcG9ydE5hbWU9IldTSW1wbEJlYW5Qb3J0IikNCi1AU3RhdGVsZXNzDQotcHVibGljIGNsYXNzIEVuZHBvaW50DQotew0KLQlATXlGaWVsZEFubm90YXRpb24obmFtZT0iZmllbGQxIikNCi0JQFdlYkZpZWxkKG5hbWU9Ik15RmllbGQiKQ0KLQlwdWJsaWMgU3RyaW5nIGZpZWxkMTsNCi0JDQotCUBNeU1ldGhvZEFubm90YXRpb24obmFtZT0iYW5ub3RhdGVkTWV0aG9kIikNCi0JQFdlYk1ldGhvZChleGNsdWRlPWZhbHNlLG9wZXJhdGlvbk5hbWU9InRlc3QiKQ0KLQlwdWJsaWMgdm9pZCBhbm5vdGF0ZWRNZXRob2QoIEBXZWJQYXJhbShuYW1lPSJhbm5vdGF0ZWRQYXJhbSIpIEBNeVBhcmFtQW5ub3RhdGlvbihuYW1lPSJhbm5vdGF0ZWRNeVBhcmFtIikgU3RyaW5nIGFubm90YXRlZFBhcmFtKSANCi0Jew0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0ludGVnZXJWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JbnRlZ2VyVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OGQ4Y2M2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0ludGVnZXJWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5JbnRlZ2VyVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbnRlZ2VyVmFsdWVJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlJbnRlZ2VyVmFsdWVJbXBsIGl2ID0gbmV3IEludGVnZXJWYWx1ZUltcGwoIjEwIik7DQotCQkJCQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBpdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiByZWFkQW5ub3RhdGlvbiA9IGFubm90YXR0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCXJlYWRBbm5vdGF0aW9uLmVxdWFscyhhbm4pOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbSIpLnRvU3RyaW5nKCksICIxMCIpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm4pOw0KLQkJYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJSW50ZWdlclZhbHVlSW1wbCBpdjEgPSBuZXcgSW50ZWdlclZhbHVlSW1wbCgiMTAiKTsNCi0JCUludGVnZXJWYWx1ZUltcGwgaXYyID0gbmV3IEludGVnZXJWYWx1ZUltcGwoIjExIik7DQotCQlJbnRlZ2VyVmFsdWVJbXBsIGl2MyA9IG5ldyBJbnRlZ2VyVmFsdWVJbXBsKCIxMCIpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoaXYxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShpdjEuZXF1YWxzKHRydWUpKTsNCi0JCWFzc2VydEZhbHNlKGl2MS5lcXVhbHMoaXYyKSk7DQotDQotCQlhc3NlcnRUcnVlKGl2MS5lcXVhbHMoaXYzKSk7DQotCQlhc3NlcnRUcnVlKGl2MS5lcXVhbHMoaXYxKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmViNjI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1BhcmFtVmFsdWVQYWlySW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlBhcmFtVmFsdWVQYWlySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuU3RyaW5nVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlUGFpckltcGxUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0iLCB2YWx1ZSk7DQotDQotCQlJVmFsdWUgdmFsdWUxID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUxIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwMSA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwoInBhcmFtMSIsIHZhbHVlMSk7DQotDQotCQlhc3NlcnRGYWxzZShwdnAuaGFzaENvZGUoKSA9PSBwdnAxLmhhc2hDb2RlKCkpOw0KLQkJYXNzZXJ0RmFsc2UocHZwLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKDEyMykpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZSIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cCA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwoInBhcmFtIiwgdmFsdWUpOw0KLQ0KLQkJSVZhbHVlIHZhbHVlMSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwMSA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwoInBhcmFtIiwgdmFsdWUxKTsNCi0NCi0JCUlWYWx1ZSB2YWx1ZTIgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZTIiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAyID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbCgicGFyYW0yIiwgdmFsdWUyKTsNCi0NCi0JCWFzc2VydFRydWUocHZwLmVxdWFscyhwdnAxKSk7DQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKHB2cDIpKTsNCi0JCWFzc2VydFRydWUocHZwLmVxdWFscyhwdnApKTsNCi0NCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UocHZwLmVxdWFscygxMjMpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDc2MTE5ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9RdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lVmFsdWVJbXBsVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKQ0KLQl7DQotCQlJVmFsdWUgcXYxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lMSIpOw0KLQkJSVZhbHVlIHF2MiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UocXYxLmhhc2hDb2RlKCkgPT0gcXYyLmhhc2hDb2RlKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0JCUlWYWx1ZSBxdjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUxIik7DQotCQlJVmFsdWUgcXYyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlhc3NlcnRGYWxzZShxdi5lcXVhbHMocXYxKSk7DQotCQlhc3NlcnRUcnVlKHF2LmVxdWFscyhxdjIpKTsNCi0JCWFzc2VydFRydWUocXYuZXF1YWxzKHF2KSk7DQotCQlhc3NlcnRGYWxzZShxdi5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UocXYuZXF1YWxzKDEyMykpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1N0cmluZ1ZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1N0cmluZ1ZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQxOWIwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9TdHJpbmdWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5TdHJpbmdWYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIFN0cmluZ1ZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VycygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJU3RyaW5nVmFsdWVJbXBsIHN2ID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgiMTAiKTsNCi0JCQkJDQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHN2KSk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbiIsIHB2LCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHJlYWRBbm5vdGF0aW9uID0gYW5ub3RhdHRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJcmVhZEFubm90YXRpb24uZXF1YWxzKGFubik7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldFByb3BlcnR5VmFsdWUoInBhcmFtIikudG9TdHJpbmcoKSwgIjEwIik7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubik7DQotCQlhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlTdHJpbmdWYWx1ZUltcGwgc3YxID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgiMTAiKTsNCi0JCVN0cmluZ1ZhbHVlSW1wbCBzdjIgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCIxMSIpOw0KLQkJU3RyaW5nVmFsdWVJbXBsIHN2MyA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoIjEwIik7DQotDQotCQlhc3NlcnRGYWxzZShzdjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHN2MS5lcXVhbHModHJ1ZSkpOw0KLQkJYXNzZXJ0RmFsc2Uoc3YxLmVxdWFscyhzdjIpKTsNCi0NCi0JCWFzc2VydFRydWUoc3YxLmVxdWFscyhzdjMpKTsNCi0JCWFzc2VydFRydWUoc3YxLmVxdWFscyhzdjEpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9jbGF6ei9BU1RVdGlsc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2NsYXp6L0FTVFV0aWxzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YjQzOGVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2NsYXp6L0FTVFV0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmNsYXp6Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlcy5UZXN0RmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIEFTVFV0aWxzfSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEFTVFV0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLnRlc3QiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gDQotCQkJImltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOyIgKyAiXG4iICsNCi0JCQkicHVibGljIGNsYXNzIFRlc3QgeyIgKyAiXG4iICsNCi0JCQkiCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBuYW1lID0gXCJhcmVcIjsiICsgIlxuIiArDQotCQkJIiAgIHB1YmxpYyBUZXN0KCkge30iICsgIlxuIiArDQotCQkJIglwdWJsaWMgaW50IGNyZWF0ZUludCgpIHtyZXR1cm4gMDt9IiArICJcbiIgKw0KLQkJCSJ9IjsJDQotDQotCXByaXZhdGUgVGVzdFByb2plY3QgcHJvamVjdDsNCi0JDQotCXB1YmxpYyB2b2lkIG1hbnVhbFNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlwcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KCJKYXZhUHJval8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJcHJvamVjdC5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsNCi0JCQlwcm9qZWN0LmRpc3Bvc2UoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFTVEZpbGVOcGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRyeSB7DQotCQkJQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVBU1QoKEZpbGUpbnVsbCwgbnVsbCk7DQotCQl9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pIHt9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFTVEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIEZpbGUgdGVtcEphdmFGaWxlID0gY3JlYXRlVGVtcEphdmFGaWxlKCk7DQotCQlBU1ROb2RlIG5vZGUgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUFTVCh0ZW1wSmF2YUZpbGUsIG51bGwpOw0KLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsNCi0JCWFzc2VydFRydWUobm9kZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7CQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBU1RJVHlwZU5wZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQlBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgoSUNvbXBpbGF0aW9uVW5pdCludWxsLCBudWxsKTsNCi0JCX0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gXykge30NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFTVElUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQltYW51YWxTZXRVcCgpOw0KLQkJZmluYWwgSVR5cGUgc291cmNlVHlwZSA9IHByb2plY3QuY3JlYXRlVHlwZShwcm9qZWN0LmNyZWF0ZVBhY2thZ2UoUENLKSwgIlRlc3QuamF2YSIsIFNSQyk7DQotCQlBU1ROb2RlIG5vZGUgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBudWxsKTsNCi0JCWFzc2VydE5vdE51bGwobm9kZSk7DQotCQlhc3NlcnRUcnVlKG5vZGUgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVEZWNsYXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbWFudWFsU2V0VXAoKTsNCi0JCWZpbmFsIElUeXBlIHNvdXJjZVR5cGUgPSBwcm9qZWN0LmNyZWF0ZVR5cGUocHJvamVjdC5jcmVhdGVQYWNrYWdlKFBDSyksICJUZXN0LmphdmEiLCBTUkMpOw0KLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBudWxsKTsNCi0JCQ0KLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYWJzdHJhY3RUeXBlID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oIlRlc3QiLCB1bml0KTsNCi0JCWFzc2VydE5vdE51bGwoYWJzdHJhY3RUeXBlKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVEZWNsYXJhdGlvbkZvcklubmVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbWFudWFsU2V0VXAoKTsNCi0JCVN0cmluZyBzb3VyY2UgPSAicHVibGljIGNsYXNzIFRlc3QgeyIgKw0KLQkJCSJwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlcnMge30iICsNCi0JCSJ9IjsJCQ0KLQkJDQotCQlmaW5hbCBJVHlwZSBzb3VyY2VUeXBlID0gcHJvamVjdC5jcmVhdGVUeXBlKHByb2plY3QuY3JlYXRlUGFja2FnZShQQ0spLCAiVGVzdC5qYXZhIiwgc291cmNlKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoc291cmNlVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbnVsbCk7DQotCQkNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZSA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCJQYXJhbWV0ZXJzIiwgdW5pdCk7DQotCQlhc3NlcnROb3ROdWxsKGFic3RyYWN0VHlwZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBKYXZhRmlsZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJRmlsZSBkaXIgPSBUZXN0RmlsZVV0aWxzLmNyZWF0ZVRlbXBEaXJlY3RvcnkoIiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCQlGaWxlIHRlbXBDbGFzc0ZpbGUgPSBuZXcgRmlsZShkaXIsICJUZXN0LmphdmEiKTsNCi0JCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih0ZW1wQ2xhc3NGaWxlKTsNCi0JCWZ3LndyaXRlKCJwYWNrYWdlICIgKyBQQ0sgKyAiO1xuIiArIFNSQyk7DQotCQlmdy5jbG9zZSgpOw0KLQkJDQotCQlyZXR1cm4gdGVtcENsYXNzRmlsZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9tb2NrL0VuZHBvaW50Rm9ybWF0LnNyYyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL21vY2svRW5kcG9pbnRGb3JtYXQuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YmY2ZmI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL21vY2svRW5kcG9pbnRGb3JtYXQuc3JjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGNsYXNzIEVuZHBvaW50e3B1YmxpYyBFbmRwb2ludCgpe31wdWJsaWMgdm9pZCB1c2VWb2lkKCl7fXB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgcyl7cmV0dXJuIHN9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmptb2NrLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlZTA1MGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9qbW9jay1jb3JlLTEuMi4wLmphciIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svLnByb2plY3QgYi90ZXN0cy9vcmcuam1vY2svLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzZjZiNDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuam1vY2s8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmptb2NrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYxMTA3OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEp1biAyMyAxODo0MTo1NSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5qbW9jay9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzFlMzQ3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O3Zpc2liaWxpdHk6PXJlZXhwb3J0DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5qbW9jaywNCi0gb3JnLmptb2NrLmJ1aWxkZXIsDQotIG9yZy5qbW9jay5jb3JlLA0KLSBvcmcuam1vY2suY29yZS5jb25zdHJhaW50LA0KLSBvcmcuam1vY2suY29yZS5tYXRjaGVyLA0KLSBvcmcuam1vY2suY29yZS5zdHViLA0KLSBvcmcuam1vY2suZXhwZWN0YXRpb24sDQotIG9yZy5qbW9jay51dGlsDQotQnVuZGxlLVZlbmRvcjogb3JnLmptb2NrDQotQnVuZGxlLUNsYXNzUGF0aDogbGliL2ptb2NrLWNvcmUtMS4yLjAuamFyDQotQnVuZGxlLVZlcnNpb246IDEuMi4wDQotRWNsaXBzZS1CdWRkeVBvbGljeTogZ2xvYmFsDQotQnVuZGxlLU5hbWU6IEpNb2NrDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5qbW9jaztzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuam1vY2svYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5qbW9jay9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI3YWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5qbW9jay9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAyMCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmptb2NrL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzYThmYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGxpYi8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9saWIvam1vY2stY29yZS0xLjIuMC5qYXIgYi90ZXN0cy9vcmcuam1vY2svbGliL2ptb2NrLWNvcmUtMS4yLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOWQzMTdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5qbW9jay9saWIvam1vY2stY29yZS0xLjIuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCg==